@ghostry/fabricator 0.0.1 → 0.0.2
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/README.md +1 -7
- package/dist/esm/Error/index.js +8 -0
- package/dist/esm/Instance/Core.js +8 -17
- package/dist/esm/Instance/Stack/Async.js +10 -0
- package/dist/esm/Instance/Stack/Sync.js +16 -0
- package/dist/esm/Primitive/bigint/Registry.js +12 -12
- package/dist/esm/Primitive/boolean/Registry.js +2 -1
- package/dist/esm/Primitive/date/Registry.js +15 -14
- package/dist/esm/Primitive/null/Registry.js +2 -1
- package/dist/esm/Primitive/number/Registry.js +18 -17
- package/dist/esm/Primitive/symbol/Registry.js +2 -1
- package/dist/esm/Primitive/undefined/Registry.js +2 -1
- package/dist/esm/Random/CallSite.js +27 -13
- package/dist/esm/Utility/Core.js +6 -1
- package/dist/esm/index.js +4 -2
- package/dist/esm/internal.js +2 -1
- package/dist/types/Adapter/Core.d.ts +29 -32
- package/dist/types/Adapter/Types.d.ts +78 -88
- package/dist/types/Bound.d.ts +15 -15
- package/dist/types/Distribution/index.d.ts +54 -61
- package/dist/types/Enumeration/Enumerate.d.ts +21 -23
- package/dist/types/Enumeration/Plan.d.ts +22 -26
- package/dist/types/Enumeration/Types.d.ts +38 -43
- package/dist/types/Error/index.d.ts +94 -76
- package/dist/types/Fabricator/Constructor.d.ts +23 -25
- package/dist/types/Fabricator/Types.d.ts +73 -81
- package/dist/types/Instance/Core.d.ts +54 -73
- package/dist/types/Instance/Stack/Async.d.ts +14 -0
- package/dist/types/Instance/Stack/Sync.d.ts +14 -0
- package/dist/types/Instance/Types.d.ts +91 -89
- package/dist/types/Primitive/always/Schema.d.ts +8 -8
- package/dist/types/Primitive/always/Types.d.ts +7 -7
- package/dist/types/Primitive/array/Registry.d.ts +10 -8
- package/dist/types/Primitive/array/Schema.d.ts +4 -5
- package/dist/types/Primitive/array/Types.d.ts +6 -6
- package/dist/types/Primitive/bigint/Registry.d.ts +6 -6
- package/dist/types/Primitive/bigint/Schema.d.ts +8 -8
- package/dist/types/Primitive/bigint/Types.d.ts +5 -5
- package/dist/types/Primitive/boolean/Outcomes.d.ts +8 -8
- package/dist/types/Primitive/boolean/Registry.d.ts +2 -12
- package/dist/types/Primitive/boolean/Schema.d.ts +8 -8
- package/dist/types/Primitive/boolean/Types.d.ts +3 -3
- package/dist/types/Primitive/choice/Fabricator.d.ts +6 -7
- package/dist/types/Primitive/choice/Registry.d.ts +13 -13
- package/dist/types/Primitive/choice/Schema.d.ts +6 -6
- package/dist/types/Primitive/choice/Types.d.ts +11 -11
- package/dist/types/Primitive/date/Registry.d.ts +25 -48
- package/dist/types/Primitive/date/Schema.d.ts +9 -10
- package/dist/types/Primitive/date/Types.d.ts +4 -4
- package/dist/types/Primitive/enum/Registry.d.ts +13 -13
- package/dist/types/Primitive/enum/Schema.d.ts +5 -5
- package/dist/types/Primitive/enum/Types.d.ts +17 -19
- package/dist/types/Primitive/namespace.d.ts +10 -10
- package/dist/types/Primitive/null/Registry.d.ts +2 -2
- package/dist/types/Primitive/null/Schema.d.ts +2 -2
- package/dist/types/Primitive/null/Types.d.ts +3 -3
- package/dist/types/Primitive/nullable/Fabricator.d.ts +7 -7
- package/dist/types/Primitive/nullable/Schema.d.ts +13 -13
- package/dist/types/Primitive/nullable/Types.d.ts +9 -10
- package/dist/types/Primitive/nullish/Fabricator.d.ts +12 -13
- package/dist/types/Primitive/nullish/Schema.d.ts +8 -8
- package/dist/types/Primitive/nullish/Types.d.ts +12 -13
- package/dist/types/Primitive/number/Registry.d.ts +20 -38
- package/dist/types/Primitive/number/Schema.d.ts +11 -12
- package/dist/types/Primitive/number/Types.d.ts +13 -13
- package/dist/types/Primitive/number/defaults.d.ts +3 -3
- package/dist/types/Primitive/object/Fabricator.d.ts +15 -15
- package/dist/types/Primitive/object/Registry.d.ts +8 -8
- package/dist/types/Primitive/object/Schema.d.ts +10 -10
- package/dist/types/Primitive/object/Types.d.ts +20 -22
- package/dist/types/Primitive/object/compute/Fabricator.d.ts +4 -5
- package/dist/types/Primitive/object/compute/Schema.d.ts +4 -4
- package/dist/types/Primitive/object/compute/Types.d.ts +19 -20
- package/dist/types/Primitive/object/omittable/Fabricator.d.ts +10 -10
- package/dist/types/Primitive/object/omittable/Outcomes.d.ts +2 -2
- package/dist/types/Primitive/object/omittable/Schema.d.ts +11 -11
- package/dist/types/Primitive/object/omittable/Types.d.ts +14 -15
- package/dist/types/Primitive/object/optional/Fabricator.d.ts +16 -18
- package/dist/types/Primitive/object/optional/Outcomes.d.ts +2 -2
- package/dist/types/Primitive/object/optional/Schema.d.ts +4 -4
- package/dist/types/Primitive/object/optional/Types.d.ts +17 -17
- package/dist/types/Primitive/opaque/Registry.d.ts +3 -3
- package/dist/types/Primitive/opaque/Schema.d.ts +8 -9
- package/dist/types/Primitive/record/Registry.d.ts +8 -6
- package/dist/types/Primitive/record/Schema.d.ts +9 -11
- package/dist/types/Primitive/record/Types.d.ts +25 -25
- package/dist/types/Primitive/recursive/Fabricator.d.ts +16 -17
- package/dist/types/Primitive/recursive/Registry.d.ts +6 -7
- package/dist/types/Primitive/recursive/Schema.d.ts +8 -8
- package/dist/types/Primitive/recursive/Terminate.d.ts +13 -14
- package/dist/types/Primitive/recursive/Types.d.ts +31 -31
- package/dist/types/Primitive/recursive/self/Fabricator.d.ts +11 -12
- package/dist/types/Primitive/recursive/self/Schema.d.ts +10 -10
- package/dist/types/Primitive/recursive/self/Types.d.ts +7 -8
- package/dist/types/Primitive/string/Constants.d.ts +12 -13
- package/dist/types/Primitive/string/Fabricator.d.ts +2 -2
- package/dist/types/Primitive/string/Registry.d.ts +10 -16
- package/dist/types/Primitive/string/Schema.d.ts +5 -5
- package/dist/types/Primitive/string/Types.d.ts +17 -17
- package/dist/types/Primitive/symbol/Fabricator.d.ts +2 -2
- package/dist/types/Primitive/symbol/Registry.d.ts +4 -11
- package/dist/types/Primitive/symbol/Schema.d.ts +6 -6
- package/dist/types/Primitive/symbol/Types.d.ts +2 -2
- package/dist/types/Primitive/tuple/Fabricator.d.ts +7 -8
- package/dist/types/Primitive/tuple/Schema.d.ts +5 -5
- package/dist/types/Primitive/tuple/Types.d.ts +24 -25
- package/dist/types/Primitive/undefinable/Fabricator.d.ts +7 -7
- package/dist/types/Primitive/undefinable/Schema.d.ts +13 -13
- package/dist/types/Primitive/undefinable/Types.d.ts +10 -10
- package/dist/types/Primitive/undefined/Registry.d.ts +2 -2
- package/dist/types/Primitive/undefined/Schema.d.ts +4 -4
- package/dist/types/Primitive/undefined/Types.d.ts +3 -3
- package/dist/types/Random/CallSite.d.ts +63 -44
- package/dist/types/Random/Generator/sfc32.d.ts +4 -4
- package/dist/types/Random/Types.d.ts +214 -236
- package/dist/types/Random/index.d.ts +63 -70
- package/dist/types/Schema/Core.d.ts +19 -21
- package/dist/types/Schema/Registry.d.ts +3 -3
- package/dist/types/Schema/Types.d.ts +41 -48
- package/dist/types/Types.d.ts +39 -45
- package/dist/types/Utility/Core.d.ts +18 -9
- package/dist/types/index.d.ts +110 -108
- package/dist/types/internal.d.ts +68 -37
- package/package.json +17 -5
|
@@ -3,10 +3,10 @@ import type { Adaptations, Adapter, Adapting, WithAdaptations } from "../../Adap
|
|
|
3
3
|
import type { Produce } from "../../Random/Types";
|
|
4
4
|
import type { Core, Fabricated, Items } from "./Types";
|
|
5
5
|
/**
|
|
6
|
-
* Buildable `choice` recipe: a weighted set of option Schemas, one of which
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Buildable `choice` recipe: a weighted set of option Schemas, one of which is
|
|
7
|
+
* drawn (and only then dispatched into a value) each fabrication. No bare form
|
|
8
|
+
* — see `Registry.ts`'s `uniform`/`weighted`, the only way to reach this
|
|
9
|
+
* Schema.
|
|
10
10
|
*/
|
|
11
11
|
export interface Schema<$Items extends Items = Items, $Adaptations extends Adaptations = {}> extends Core<$Items, $Adaptations> {
|
|
12
12
|
/**
|
|
@@ -16,8 +16,8 @@ export interface Schema<$Items extends Items = Items, $Adaptations extends Adapt
|
|
|
16
16
|
*/
|
|
17
17
|
as: (produce: Produce<Fabricated<$Items>>) => Schema<$Items, $Adaptations>;
|
|
18
18
|
/**
|
|
19
|
-
* Override what this schema maps to in one or more external schema
|
|
20
|
-
*
|
|
19
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
20
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
21
21
|
*/
|
|
22
22
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Items, $Adaptations>>) => $Returnable) => Schema<$Items, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
23
23
|
}
|
|
@@ -5,22 +5,22 @@ import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
|
5
5
|
/** The schemas a `choice` can draw from. */
|
|
6
6
|
export type Item = AnySchema;
|
|
7
7
|
/**
|
|
8
|
-
* A
|
|
9
|
-
* `ReadonlyArray<[number, Item]>`, which would remember only the union of
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* A _tuple_ of `[weight, option]` pairs, one per position — not a flattened
|
|
9
|
+
* `ReadonlyArray<[number, Item]>`, which would remember only the union of every
|
|
10
|
+
* option's type and lose how many options there were (two identical option
|
|
11
|
+
* types would collapse to one union member). The real tuple is what lets
|
|
12
|
+
* `Adapter/TypeBox` mirror TypeBox's `Union<T>` — which collapses to a bare
|
|
13
|
+
* schema for a single option and only wraps in `TUnion<T>` for two or more —
|
|
14
|
+
* instead of always wrapping regardless of count.
|
|
15
15
|
*/
|
|
16
16
|
export type Items = ReadonlyArray<readonly [number, Item]>;
|
|
17
17
|
export type Fabricated<$Items extends Items = Items, $Bindings extends unknown[] = []> = ValueOf<$Items[number][1], $Bindings>;
|
|
18
18
|
/**
|
|
19
19
|
* Always stored as weighted pairs — `.uniform(...)` (`Registry.ts`) is
|
|
20
|
-
* `.weighted(...)` with every item given weight `1`, so there is only one
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* `.weighted(...)` with every item given weight `1`, so there is only one shape
|
|
21
|
+
* to fabricate from. `produce` layers an opaque production via `.as()`, carried
|
|
22
|
+
* alongside `items` rather than replacing it, so a prior option set survives
|
|
23
|
+
* `.as()` for future validation.
|
|
24
24
|
*/
|
|
25
25
|
export type Meta<$Items extends Items = Items> = {
|
|
26
26
|
items: $Items;
|
|
@@ -1,44 +1,32 @@
|
|
|
1
1
|
import type { Adaptations } from "../../Adapter/Types";
|
|
2
2
|
import { type InputBound } from "../../Bound";
|
|
3
3
|
import { type Distribution } from "../../Distribution";
|
|
4
|
-
import { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
5
4
|
import { Schema } from "./Schema";
|
|
6
|
-
import type {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
as: (produce: import("../../Random/Types").Produce<Fabricated>) => Schema<{}, Adaptations>;
|
|
13
|
-
adapt: <const $Adapter extends import("../..").Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: import("../..").Adapting<Schema<{}, Adaptations>>) => $Returnable) => Schema<{}, import("../../Adapter/Types").WithAdaptations<Adaptations, import("../../Adapter/Core").AdaptationEntry<$Adapter, $Returnable>>>;
|
|
5
|
+
import type { Whereby } from "./Types";
|
|
6
|
+
type ThisRegistry = Schema<{}, Adaptations> & {
|
|
7
|
+
/**
|
|
8
|
+
* A `Date` drawn from `[min, max]`. Pass a `distribution` to shape how values
|
|
9
|
+
* cluster within the range; without one, every instant is equally likely.
|
|
10
|
+
*/
|
|
14
11
|
whereby: (whereby: {
|
|
15
12
|
min: InputBound<Date>;
|
|
16
13
|
max: InputBound<Date>;
|
|
17
14
|
distribution?: Distribution | undefined;
|
|
18
15
|
}) => Schema<{
|
|
19
16
|
whereby: Whereby;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
[Adaptation]?: {};
|
|
29
|
-
as: (produce: import("../../Random/Types").Produce<Fabricated>) => Schema<{
|
|
30
|
-
mode: "past";
|
|
31
|
-
}, {}>;
|
|
32
|
-
adapt: <const $Adapter extends import("../..").Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: import("../..").Adapting<Schema<{
|
|
33
|
-
mode: "past";
|
|
34
|
-
}, {}>>) => $Returnable) => Schema<{
|
|
35
|
-
mode: "past";
|
|
36
|
-
}, import("../../Adapter/Types").WithAdaptations<{}, import("../../Adapter/Core").AdaptationEntry<$Adapter, $Returnable>>>;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Any `Date` from the earliest representable instant up to the present
|
|
20
|
+
* moment.
|
|
21
|
+
*/
|
|
22
|
+
past: Schema<{
|
|
23
|
+
mode: "past";
|
|
24
|
+
}> & {
|
|
37
25
|
/**
|
|
38
26
|
* A past `Date` drawn from `[min, now]`. `min` defaults to the earliest
|
|
39
27
|
* representable instant. The implicit `now` end stays inclusive. Pass a
|
|
40
|
-
* `distribution` to shape how values cluster within the range; without
|
|
41
|
-
*
|
|
28
|
+
* `distribution` to shape how values cluster within the range; without one,
|
|
29
|
+
* every instant is equally likely.
|
|
42
30
|
*/
|
|
43
31
|
whereby: (whereby: {
|
|
44
32
|
min?: InputBound<Date> | undefined;
|
|
@@ -46,29 +34,17 @@ declare const _default: {
|
|
|
46
34
|
}) => Schema<{
|
|
47
35
|
mode: "past";
|
|
48
36
|
whereby: Whereby;
|
|
49
|
-
}
|
|
37
|
+
}>;
|
|
50
38
|
};
|
|
51
39
|
/** Any `Date` from the present moment up to the latest representable instant. */
|
|
52
|
-
future: {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
mode: "future";
|
|
56
|
-
};
|
|
57
|
-
[Produces]?: Fabricated;
|
|
58
|
-
[Adaptation]?: {};
|
|
59
|
-
as: (produce: import("../../Random/Types").Produce<Fabricated>) => Schema<{
|
|
60
|
-
mode: "future";
|
|
61
|
-
}, {}>;
|
|
62
|
-
adapt: <const $Adapter extends import("../..").Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: import("../..").Adapting<Schema<{
|
|
63
|
-
mode: "future";
|
|
64
|
-
}, {}>>) => $Returnable) => Schema<{
|
|
65
|
-
mode: "future";
|
|
66
|
-
}, import("../../Adapter/Types").WithAdaptations<{}, import("../../Adapter/Core").AdaptationEntry<$Adapter, $Returnable>>>;
|
|
40
|
+
future: Schema<{
|
|
41
|
+
mode: "future";
|
|
42
|
+
}> & {
|
|
67
43
|
/**
|
|
68
44
|
* A future `Date` drawn from `[now, max]`. `max` defaults to the latest
|
|
69
45
|
* representable instant. The implicit `now` end stays inclusive. Pass a
|
|
70
|
-
* `distribution` to shape how values cluster within the range; without
|
|
71
|
-
*
|
|
46
|
+
* `distribution` to shape how values cluster within the range; without one,
|
|
47
|
+
* every instant is equally likely.
|
|
72
48
|
*/
|
|
73
49
|
whereby: (whereby: {
|
|
74
50
|
max?: InputBound<Date> | undefined;
|
|
@@ -76,7 +52,8 @@ declare const _default: {
|
|
|
76
52
|
}) => Schema<{
|
|
77
53
|
mode: "future";
|
|
78
54
|
whereby: Whereby;
|
|
79
|
-
}
|
|
55
|
+
}>;
|
|
80
56
|
};
|
|
81
57
|
};
|
|
82
|
-
|
|
58
|
+
declare const registry: ThisRegistry;
|
|
59
|
+
export default registry;
|
|
@@ -4,24 +4,23 @@ import type { Produce } from "../../Random/Types";
|
|
|
4
4
|
import type { Core, Fabricated, Meta as ThisMeta } from "./Types";
|
|
5
5
|
/**
|
|
6
6
|
* Buildable `Date` recipe: a range/distribution (`whereby`, absent for the
|
|
7
|
-
* full-range bare form), optionally scoped by `mode` to `"past"` (up to now)
|
|
8
|
-
*
|
|
7
|
+
* full-range bare form), optionally scoped by `mode` to `"past"` (up to now) or
|
|
8
|
+
* `"future"` (from now), or opaque production via `as`.
|
|
9
9
|
*
|
|
10
|
-
* `$Meta` is generic (defaulting to the full `Meta` union) so builder
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* `number/Schema.ts`.
|
|
10
|
+
* `$Meta` is generic (defaulting to the full `Meta` union) so builder return
|
|
11
|
+
* types stay narrow — e.g. `T.date.past` types as `Schema<{ mode: "past" }>`,
|
|
12
|
+
* not the widened `Schema` — see `number/Schema.ts`.
|
|
14
13
|
*/
|
|
15
14
|
export interface Schema<$Meta extends ThisMeta = ThisMeta, $Adaptations extends Adaptations = {}> extends Core<$Meta, $Adaptations> {
|
|
16
15
|
/**
|
|
17
16
|
* Layer an opaque production on this schema's existing `[Meta]` — carrying
|
|
18
|
-
* `mode`/`whereby` forward, not discarding them, so a later `.as(...)`
|
|
19
|
-
*
|
|
17
|
+
* `mode`/`whereby` forward, not discarding them, so a later `.as(...)` (or
|
|
18
|
+
* future validation of `produce`) still has them to check against.
|
|
20
19
|
*/
|
|
21
20
|
as: (produce: Produce<Fabricated>) => Schema<$Meta, $Adaptations>;
|
|
22
21
|
/**
|
|
23
|
-
* Override what this schema maps to in one or more external schema
|
|
24
|
-
*
|
|
22
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
23
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
25
24
|
*/
|
|
26
25
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Meta, $Adaptations>>) => $Returnable) => Schema<$Meta, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
27
26
|
}
|
|
@@ -16,10 +16,10 @@ export type Whereby = {
|
|
|
16
16
|
export type Fabricated = Date;
|
|
17
17
|
/**
|
|
18
18
|
* A range/distribution (`whereby`, absent for the full-range bare form),
|
|
19
|
-
* optionally scoped by `mode` to `"past"` (up to now) or `"future"` (from
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
19
|
+
* optionally scoped by `mode` to `"past"` (up to now) or `"future"` (from now),
|
|
20
|
+
* optionally overridden by an opaque `as` production — carried alongside the
|
|
21
|
+
* rest rather than replacing it, so a prior scoping survives `as` for future
|
|
22
|
+
* validation.
|
|
23
23
|
*/
|
|
24
24
|
export type Meta = {
|
|
25
25
|
mode?: "past" | "future";
|
|
@@ -5,34 +5,34 @@ import type { Item, Items } from "./Types";
|
|
|
5
5
|
* per-position member types (`{ [K in keyof $Items]: ... }` walks a tuple
|
|
6
6
|
* position-by-position, unlike `ReadonlyArray<...>`'s `.map()`, which only
|
|
7
7
|
* remembers the union of every element it saw). This is what lets
|
|
8
|
-
* `Adapter/TypeBox` recover real arity later and mirror TypeBox's
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `Adapter/TypeBox` recover real arity later and mirror TypeBox's `Union<T>`
|
|
9
|
+
* collapse-for-a-single-member — see `Types.ts`'s `Items`. The same helper
|
|
10
|
+
* `choice/Registry.ts` uses, for the same reason.
|
|
11
11
|
*/
|
|
12
12
|
type Weighted<$Items extends ReadonlyArray<Item>> = {
|
|
13
13
|
[$K in keyof $Items]: readonly [number, $Items[$K]];
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
16
|
* At least one element — an empty `enum` has no member to draw, which would
|
|
17
|
-
* otherwise fail inside `weighted()` (`Distribution/index.ts`) with an
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
17
|
+
* otherwise fail inside `weighted()` (`Distribution/index.ts`) with an opaque
|
|
18
|
+
* `TypeError` at fabricate time (weight sum is `0`, so `.find` returns
|
|
19
|
+
* `undefined` and `chosen![1]` throws). Rejecting emptiness here is a
|
|
20
|
+
* construction-time compile error; the runtime check below is the backstop for
|
|
21
|
+
* an `as any` call that bypasses it.
|
|
22
22
|
*/
|
|
23
23
|
type NonEmpty<$T> = readonly [$T, ...$T[]];
|
|
24
24
|
declare const _default: {
|
|
25
25
|
/**
|
|
26
26
|
* Equal probability across every member. Delegates to `weighted` with a
|
|
27
27
|
* uniform weight of `1` per item — a plain `weighted()` draw is already a
|
|
28
|
-
* uniform draw when every weight is equal, so there is no separate
|
|
29
|
-
*
|
|
28
|
+
* uniform draw when every weight is equal, so there is no separate unweighted
|
|
29
|
+
* code path to keep in sync.
|
|
30
30
|
*/
|
|
31
31
|
uniform: <const $Items extends NonEmpty<Item>>(items: $Items) => Schema<Weighted<$Items>>;
|
|
32
32
|
/**
|
|
33
|
-
* Relative probability across members, given as `[weight, item]` pairs —
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* Relative probability across members, given as `[weight, item]` pairs — the
|
|
34
|
+
* same tuple shape `weighted()` (`Distribution/index.ts`) itself accepts, not
|
|
35
|
+
* an object keyed by member.
|
|
36
36
|
*/
|
|
37
37
|
weighted: <const $Items extends NonEmpty<Items[number]>>(items: $Items) => Schema<$Items>;
|
|
38
38
|
};
|
|
@@ -3,9 +3,9 @@ import type { Adaptations, Adapter, Adapting, WithAdaptations } from "../../Adap
|
|
|
3
3
|
import type { Produce } from "../../Random/Types";
|
|
4
4
|
import type { Core, Fabricated, Items } from "./Types";
|
|
5
5
|
/**
|
|
6
|
-
* The buildable recipe for an `enum`: a weighted set of member values, one
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
6
|
+
* The buildable recipe for an `enum`: a weighted set of member values, one of
|
|
7
|
+
* which is drawn each fabrication. There is no bare form — see `Registry.ts`'s
|
|
8
|
+
* `uniform`/`weighted`, the only way to reach this Schema.
|
|
9
9
|
*/
|
|
10
10
|
export interface Schema<$Items extends Items = Items, $Adaptations extends Adaptations = {}> extends Core<$Items, $Adaptations> {
|
|
11
11
|
/**
|
|
@@ -15,8 +15,8 @@ export interface Schema<$Items extends Items = Items, $Adaptations extends Adapt
|
|
|
15
15
|
*/
|
|
16
16
|
as: (produce: Produce<Fabricated<$Items>>) => Schema<$Items, $Adaptations>;
|
|
17
17
|
/**
|
|
18
|
-
* Override what this schema maps to in one or more external schema
|
|
19
|
-
*
|
|
18
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
19
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
20
20
|
*/
|
|
21
21
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Items, $Adaptations>>) => $Returnable) => Schema<$Items, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
22
22
|
}
|
|
@@ -2,35 +2,33 @@ import type { Adaptations } from "../../Adapter/Types";
|
|
|
2
2
|
import type { Produce } from "../../Random/Types";
|
|
3
3
|
import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
4
4
|
/**
|
|
5
|
-
* The values an `enum` can draw from — any value at all, for the same
|
|
6
|
-
*
|
|
5
|
+
* The values an `enum` can draw from — any value at all, for the same reason
|
|
6
|
+
* `always.Value` is unconstrained (see its doc).
|
|
7
7
|
*
|
|
8
|
-
* What still separates `enum` from `choice`: an `enum` draws one of these
|
|
9
|
-
*
|
|
10
|
-
* from it.
|
|
8
|
+
* What still separates `enum` from `choice`: an `enum` draws one of these exact
|
|
9
|
+
* _values_; a `choice` draws one of these _schemas_ and fabricates from it.
|
|
11
10
|
*/
|
|
12
11
|
export type Item = unknown;
|
|
13
12
|
/**
|
|
14
|
-
* A
|
|
15
|
-
* `ReadonlyArray<[number, Item]>`, which would remember only the union of
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* wrapper.
|
|
13
|
+
* A _tuple_ of `[weight, item]` pairs, one per position — not a flattened
|
|
14
|
+
* `ReadonlyArray<[number, Item]>`, which would remember only the union of every
|
|
15
|
+
* member's type and lose how many members there were (two identical member
|
|
16
|
+
* types would collapse to one union member). The real tuple is what lets
|
|
17
|
+
* `Adapter/TypeBox` mirror TypeBox's `Union<T>` — which collapses to a bare
|
|
18
|
+
* schema for a single member and only wraps in `TUnion<T>` for two or more —
|
|
19
|
+
* instead of mapping each member independently and losing the union wrapper.
|
|
22
20
|
*
|
|
23
|
-
* Identical shape to `choice.Items`; the two kinds differ only in what sits
|
|
24
|
-
*
|
|
21
|
+
* Identical shape to `choice.Items`; the two kinds differ only in what sits on
|
|
22
|
+
* the right of each pair (a value here, a Schema there).
|
|
25
23
|
*/
|
|
26
24
|
export type Items = ReadonlyArray<readonly [number, Item]>;
|
|
27
25
|
export type Fabricated<$Items extends Items = Items> = $Items[number][1];
|
|
28
26
|
/**
|
|
29
27
|
* Always stored as weighted pairs — `.uniform(...)` (`Registry.ts`) is
|
|
30
|
-
* `.weighted(...)` with every item given weight `1`, so there is only one
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
28
|
+
* `.weighted(...)` with every item given weight `1`, so there is only one shape
|
|
29
|
+
* to fabricate from. `produce` layers an opaque production via `.as()`, carried
|
|
30
|
+
* alongside `items` rather than replacing it, so a prior member set survives
|
|
31
|
+
* `.as()` for future validation.
|
|
34
32
|
*/
|
|
35
33
|
export type Meta<$Items extends Items = Items> = {
|
|
36
34
|
items: $Items;
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
* The kind modules as a single namespace object — `Primitive.boolean`,
|
|
3
3
|
* `Primitive.object.compute`, and so on.
|
|
4
4
|
*
|
|
5
|
-
* Each kind's `Types.ts` must stay type-only. A value export in the same
|
|
6
|
-
*
|
|
7
|
-
* module
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Each kind's `Types.ts` must stay type-only. A value export in the same file
|
|
6
|
+
* as `export type Fabricated = boolean` (or `string`) makes that module a value
|
|
7
|
+
* module; `export * as boolean` here then resolves `boolean` to this namespace
|
|
8
|
+
* rather than the TypeScript primitive, which drops `[Kind]`/`[Meta]` off
|
|
9
|
+
* `Core`. Named outcome lists and string's character tables live in
|
|
10
|
+
* `Outcomes.ts`.
|
|
11
11
|
*
|
|
12
|
-
* A top-level `import * as boolean` is the same trap without needing a
|
|
13
|
-
*
|
|
12
|
+
* A top-level `import * as boolean` is the same trap without needing a cycle
|
|
13
|
+
* through this file. Prefer `import { Primitive }`.
|
|
14
14
|
*
|
|
15
15
|
* Consumed as `import { Primitive }` from `./index` (or from
|
|
16
|
-
* `@ghostry/fabricator/internal`). Do not add this object to the
|
|
17
|
-
*
|
|
16
|
+
* `@ghostry/fabricator/internal`). Do not add this object to the registry:
|
|
17
|
+
* `T.Primitive` is not a builder.
|
|
18
18
|
*/
|
|
19
19
|
export * as always from "./always";
|
|
20
20
|
export * as array from "./array";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Schema } from "./Schema";
|
|
2
|
-
declare const
|
|
3
|
-
export default
|
|
2
|
+
declare const registry: Schema;
|
|
3
|
+
export default registry;
|
|
@@ -8,8 +8,8 @@ import type { Core, Meta as ThisMeta } from "./Types";
|
|
|
8
8
|
*/
|
|
9
9
|
export interface Schema<$Adaptations extends Adaptations = {}> extends Core<ThisMeta, $Adaptations> {
|
|
10
10
|
/**
|
|
11
|
-
* Override what this schema maps to in one or more external schema
|
|
12
|
-
*
|
|
11
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
12
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
13
13
|
*/
|
|
14
14
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Adaptations>>) => $Returnable) => Schema<WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
15
15
|
}
|
|
@@ -2,9 +2,9 @@ import type { Adaptations } from "../../Adapter/Types";
|
|
|
2
2
|
import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
3
3
|
export type Fabricated = null;
|
|
4
4
|
/**
|
|
5
|
-
* Nothing to configure: `null` has exactly one possible value, so there is
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Nothing to configure: `null` has exactly one possible value, so there is no
|
|
6
|
+
* `.as()` (see `always/Types.ts` for the same reasoning) and no other knob to
|
|
7
|
+
* carry.
|
|
8
8
|
*/
|
|
9
9
|
export type Meta = Record<string, never>;
|
|
10
10
|
export type Core<$Meta extends Meta = Meta, $Adaptations extends Adaptations = {}> = {
|
|
@@ -19,13 +19,13 @@ export type Fabricator<$Schema extends {
|
|
|
19
19
|
fabricate: () => Fabricated<$Schema[typeof Meta]["definition"]>;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
|
-
* A presence roll on this field's private stream, drawn only when the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
22
|
+
* A presence roll on this field's private stream, drawn only when the wrapped
|
|
23
|
+
* value is needed — a `null` roll never advances `source`'s stream, and since
|
|
24
|
+
* `source` is already dispatched into its own independent stream by
|
|
25
|
+
* `Constructor.ts` regardless of this roll, skipping its draw here can never
|
|
26
|
+
* perturb any other field's reproducibility (see
|
|
27
27
|
* `object/omittable/Fabricator.ts`, and CLAUDE.md's "Randomness"). 50/50 by
|
|
28
|
-
* default; `.weighted(...)` (`Schema.ts`) reweights either outcome relative
|
|
29
|
-
*
|
|
28
|
+
* default; `.weighted(...)` (`Schema.ts`) reweights either outcome relative to
|
|
29
|
+
* that same default of `1`.
|
|
30
30
|
*/
|
|
31
31
|
export declare function Fabricator<$Definition extends Definition>(context: FabricatorContext<Schema<$Definition>>, source: BaseFabricator<any>): Fabricator<Schema<$Definition>>;
|
|
@@ -10,25 +10,25 @@ import type { Core, Definition, Fabricated, Weights } from "./Types";
|
|
|
10
10
|
export interface Schema<$Definition extends Definition = Definition, $Adaptations extends Adaptations = {}> extends Core<$Definition, $Adaptations> {
|
|
11
11
|
/**
|
|
12
12
|
* Layer an opaque production on this schema's existing `[Meta]` — carrying
|
|
13
|
-
* `definition` forward, not discarding it, so a later `.as(...)` (or
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* `definition` forward, not discarding it, so a later `.as(...)` (or future
|
|
14
|
+
* validation of `produce`) still has it to check against. `produce` may
|
|
15
|
+
* return `null`, so custom logic composes the same way the built-in roll
|
|
16
|
+
* does.
|
|
17
17
|
*/
|
|
18
18
|
as: (produce: Produce<Fabricated<$Definition>>) => Schema<$Definition, $Adaptations>;
|
|
19
19
|
/**
|
|
20
|
-
* Reweight the built-in 50/50 roll. Keys are optional — an omitted key
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* `.weighted({ null: 0.1 })` shifts both outcomes' shares, not just
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
20
|
+
* Reweight the built-in 50/50 roll. Keys are optional — an omitted key keeps
|
|
21
|
+
* baseline weight `1`, the same weight the 50/50 split already uses — but
|
|
22
|
+
* that baseline is still relative to whatever else is specified, so
|
|
23
|
+
* `.weighted({ null: 0.1 })` shifts both outcomes' shares, not just `null`'s
|
|
24
|
+
* (see `Types.ts`'s `Weights`). Chaining `.weighted(...)` merges into
|
|
25
|
+
* previous weights rather than replacing them, the same layering `.as(...)`
|
|
26
|
+
* uses for `produce`.
|
|
27
27
|
*/
|
|
28
28
|
weighted: (weights: Weights) => Schema<$Definition, $Adaptations>;
|
|
29
29
|
/**
|
|
30
|
-
* Override what this schema maps to in one or more external schema
|
|
31
|
-
*
|
|
30
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
31
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
32
32
|
*/
|
|
33
33
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Definition, $Adaptations>>) => $Returnable) => Schema<$Definition, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
34
34
|
}
|
|
@@ -7,19 +7,18 @@ export type Definition = AnySchema;
|
|
|
7
7
|
export type Fabricated<$Definition extends Definition, $Bindings extends unknown[] = []> = ValueOf<$Definition, $Bindings> | null;
|
|
8
8
|
export type { Outcome } from "./Outcomes";
|
|
9
9
|
/**
|
|
10
|
-
* Relative weights for `.weighted(...)`, keyed by `Outcome`. Keys optional —
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Relative weights for `.weighted(...)`, keyed by `Outcome`. Keys optional — an
|
|
11
|
+
* omitted key falls back to baseline `1`, the same weight the 50/50 split
|
|
12
|
+
* already uses. Values are relative, exactly like `weighted()`
|
|
13
13
|
* (`Distribution/index.ts`) — they need not sum to one, and are fed to
|
|
14
14
|
* `weighted()` unchanged alongside each unspecified key's baseline `1`.
|
|
15
15
|
*
|
|
16
|
-
* Specifying one outcome's weight shifts the
|
|
17
|
-
* probability too, even though its weight stays at `1` — its share of the
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* in play.
|
|
16
|
+
* Specifying one outcome's weight shifts the _other_ outcome's resulting
|
|
17
|
+
* probability too, even though its weight stays at `1` — its share of the total
|
|
18
|
+
* still moves, since the total changed. `.weighted({ null: 0.1 })` is not "10%
|
|
19
|
+
* null, 90% present" — with `value` at default `1`, the split is `0.1 / 1.1 ≈
|
|
20
|
+
* 9.1%` null, `≈90.9%` value. No independent "absolute probability" mode;
|
|
21
|
+
* weights are only meaningful relative to the full set in play.
|
|
23
22
|
*/
|
|
24
23
|
export type Weights = {
|
|
25
24
|
null: number;
|
|
@@ -19,18 +19,17 @@ export type Fabricator<$Schema extends {
|
|
|
19
19
|
fabricate: () => Fabricated<$Schema[typeof Meta]["definition"]>;
|
|
20
20
|
};
|
|
21
21
|
/**
|
|
22
|
-
* Three-way roll: `null`, `undefined`, or the wrapped value — on this
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* CLAUDE.md's "Randomness").
|
|
22
|
+
* Three-way roll: `null`, `undefined`, or the wrapped value — on this field's
|
|
23
|
+
* private stream; `source` is drawn only when "value" wins. Uniform (1/3 each)
|
|
24
|
+
* by default; not achievable by composing `nullable(T.undefinable(inner))`'s
|
|
25
|
+
* two independent 50/50 rolls (that is 50/25/25, not 33/33/33), hence the
|
|
26
|
+
* dedicated three-way `weighted()` here — see `object/optional/Fabricator.ts`
|
|
27
|
+
* and CLAUDE.md's "Why `T.optional` isn't `omittable(undefinable(inner))`".
|
|
28
|
+
* `.weighted(...)` (`Schema.ts`) reweights individual outcomes relative to that
|
|
29
|
+
* same default of `1`; an unspecified outcome keeps it. Skipping `source`'s
|
|
30
|
+
* draw on the two non-"value" outcomes is safe for the same reason as
|
|
31
|
+
* `object/omittable/Fabricator.ts`: `source` already has its own independent
|
|
32
|
+
* stream, minted at build time regardless of this roll (see CLAUDE.md's
|
|
33
|
+
* "Randomness").
|
|
35
34
|
*/
|
|
36
35
|
export declare function Fabricator<$Definition extends Definition>(context: FabricatorContext<Schema<$Definition>>, source: BaseFabricator<any>): Fabricator<Schema<$Definition>>;
|
|
@@ -4,16 +4,16 @@ import type { Produce } from "../../Random/Types";
|
|
|
4
4
|
import type { AnySchema } from "../../Schema/Types";
|
|
5
5
|
import type { Core, Definition, Fabricated, Weights } from "./Types";
|
|
6
6
|
/**
|
|
7
|
-
* The buildable recipe for a `nullish`: a single wrapped Schema, drawn (or
|
|
8
|
-
*
|
|
7
|
+
* The buildable recipe for a `nullish`: a single wrapped Schema, drawn (or not)
|
|
8
|
+
* each fabrication.
|
|
9
9
|
*/
|
|
10
10
|
export interface Schema<$Definition extends Definition = Definition, $Adaptations extends Adaptations = {}> extends Core<$Definition, $Adaptations> {
|
|
11
11
|
/**
|
|
12
12
|
* Layer an opaque production on this schema's existing `[Meta]` — carrying
|
|
13
|
-
* `definition` forward, not discarding it, so a later `.as(...)` (or
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* `definition` forward, not discarding it, so a later `.as(...)` (or future
|
|
14
|
+
* validation of `produce`) still has it to check against. `produce` may
|
|
15
|
+
* return `null` or `undefined`, so custom logic composes the same way the
|
|
16
|
+
* built-in three-way roll does.
|
|
17
17
|
*/
|
|
18
18
|
as: (produce: Produce<Fabricated<$Definition>>) => Schema<$Definition, $Adaptations>;
|
|
19
19
|
/**
|
|
@@ -27,8 +27,8 @@ export interface Schema<$Definition extends Definition = Definition, $Adaptation
|
|
|
27
27
|
*/
|
|
28
28
|
weighted: (weights: Weights) => Schema<$Definition, $Adaptations>;
|
|
29
29
|
/**
|
|
30
|
-
* Override what this schema maps to in one or more external schema
|
|
31
|
-
*
|
|
30
|
+
* Override what this schema maps to in one or more external schema libraries
|
|
31
|
+
* — see `string/Schema.ts`'s `adapt` for the full contract.
|
|
32
32
|
*/
|
|
33
33
|
adapt: <const $Adapter extends Adapter, $Returnable extends ReturnType<$Adapter["convert"]>>(adapter: $Adapter, produce: (adapting: Adapting<Schema<$Definition, $Adaptations>>) => $Returnable) => Schema<$Definition, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
34
34
|
}
|
|
@@ -3,27 +3,26 @@ import type { Produce } from "../../Random/Types";
|
|
|
3
3
|
import type { AnySchema, ValueOf } from "../../Schema/Types";
|
|
4
4
|
import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
5
5
|
/**
|
|
6
|
-
* The wrapped schema — the value type produced when the roll lands on
|
|
7
|
-
*
|
|
6
|
+
* The wrapped schema — the value type produced when the roll lands on neither
|
|
7
|
+
* `null` nor `undefined`.
|
|
8
8
|
*/
|
|
9
9
|
export type Definition = AnySchema;
|
|
10
10
|
export type Fabricated<$Definition extends Definition, $Bindings extends unknown[] = []> = ValueOf<$Definition, $Bindings> | null | undefined;
|
|
11
11
|
export type { Outcome } from "./Outcomes";
|
|
12
12
|
/**
|
|
13
|
-
* Relative weights for `.weighted(...)`, keyed by `Outcome`. Keys optional —
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* Relative weights for `.weighted(...)`, keyed by `Outcome`. Keys optional — an
|
|
14
|
+
* omitted key falls back to baseline `1`, the same weight the uniform 1/3 split
|
|
15
|
+
* already uses. Values are relative, exactly like `weighted()`
|
|
16
16
|
* (`Distribution/index.ts`) — they need not sum to one, and are fed to
|
|
17
17
|
* `weighted()` unchanged alongside each unspecified key's baseline `1`.
|
|
18
18
|
*
|
|
19
|
-
* Specifying one outcome's weight shifts
|
|
20
|
-
* probability, not just the named one — unspecified ones stay at weight `1`
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* relative to the full set in play.
|
|
19
|
+
* Specifying one outcome's weight shifts _every_ outcome's resulting
|
|
20
|
+
* probability, not just the named one — unspecified ones stay at weight `1` but
|
|
21
|
+
* their share of the total still moves, since the total changed. `.weighted({
|
|
22
|
+
* null: 0.1 })` on `T.nullish` is not "10% null, other two still 33%" — with
|
|
23
|
+
* `undefined`/`value` at default `1`, the split is `0.1 / 2.1 ≈ 4.8%` null and
|
|
24
|
+
* `≈47.6%` each for the other two. No independent "absolute probability" mode;
|
|
25
|
+
* weights are only meaningful relative to the full set in play.
|
|
27
26
|
*/
|
|
28
27
|
export type Weights = {
|
|
29
28
|
null: number;
|