@ghostry/fabricator 0.0.1 → 0.0.3
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 +18 -12
- package/dist/esm/Adapter/Core.js +3 -3
- package/dist/esm/Enumeration/Enumerate.js +16 -13
- package/dist/esm/Error/index.js +16 -8
- package/dist/esm/Fabricator/Constructor.js +12 -14
- package/dist/esm/Harnessing/Core.js +30 -0
- package/dist/esm/Harnessing/Salt.js +12 -0
- package/dist/esm/Harnessing/Types.js +1 -0
- package/dist/esm/Instance/Core.js +25 -41
- 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/recursive/Fabricator.js +1 -1
- package/dist/esm/Primitive/symbol/Registry.js +2 -1
- package/dist/esm/Primitive/undefined/Registry.js +2 -1
- package/dist/esm/Random/index.js +24 -79
- package/dist/esm/Utility/Core.js +6 -1
- package/dist/esm/adapting.js +2 -0
- package/dist/esm/harnessing.js +1 -0
- package/dist/esm/index.js +5 -4
- package/dist/esm/internal.js +2 -2
- package/dist/types/Adapter/Core.d.ts +30 -33
- 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 +24 -24
- 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 +103 -89
- package/dist/types/Fabricator/Constructor.d.ts +24 -26
- package/dist/types/Fabricator/Types.d.ts +73 -81
- package/dist/types/Harnessing/Core.d.ts +43 -0
- package/dist/types/Harnessing/Salt.d.ts +31 -0
- package/dist/types/Harnessing/Types.d.ts +79 -0
- package/dist/types/Instance/Core.d.ts +38 -74
- 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 +98 -102
- 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 +20 -21
- 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/Generator/sfc32.d.ts +4 -4
- package/dist/types/Random/Types.d.ts +151 -293
- package/dist/types/Random/index.d.ts +56 -81
- 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/adapting.d.ts +32 -0
- package/dist/types/harnessing.d.ts +30 -0
- package/dist/types/index.d.ts +95 -128
- package/dist/types/internal.d.ts +53 -40
- package/package.json +39 -7
- package/dist/esm/Random/CallSite.js +0 -56
- package/dist/types/Random/CallSite.d.ts +0 -59
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import type { Adaptations } from "../../Adapter/Types";
|
|
2
|
-
import { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
3
2
|
import { Schema } from "./Schema";
|
|
4
|
-
|
|
5
|
-
declare const _default: {
|
|
6
|
-
[Kind]: "symbol";
|
|
7
|
-
[Meta]: {};
|
|
8
|
-
[Produces]?: Fabricated;
|
|
9
|
-
[Adaptation]?: Adaptations;
|
|
10
|
-
as: (produce: import("../../Random/Types").Produce<Fabricated>) => Schema<{}, Adaptations>;
|
|
11
|
-
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>>>;
|
|
3
|
+
type ThisRegistry = Schema<{}, Adaptations> & {
|
|
12
4
|
keyed: (key: string) => Schema<{
|
|
13
5
|
key: string;
|
|
14
|
-
}
|
|
6
|
+
}>;
|
|
15
7
|
};
|
|
16
|
-
|
|
8
|
+
declare const registry: ThisRegistry;
|
|
9
|
+
export default registry;
|
|
@@ -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, Meta as ThisMeta } from "./Types";
|
|
5
5
|
/**
|
|
6
|
-
* `$Meta` is generic (defaulting to the full `Meta` union) so builder
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
6
|
+
* `$Meta` is generic (defaulting to the full `Meta` union) so builder return
|
|
7
|
+
* types stay narrow — see `number/Schema.ts`. `$Adaptations` is threaded
|
|
8
|
+
* through every builder method for the same reason — see `string/Schema.ts`'s
|
|
9
|
+
* `adapt`.
|
|
10
10
|
*/
|
|
11
11
|
export interface Schema<$Meta extends ThisMeta = ThisMeta, $Adaptations extends Adaptations = {}> extends Core<$Meta, $Adaptations> {
|
|
12
12
|
/**
|
|
@@ -16,8 +16,8 @@ export interface Schema<$Meta extends ThisMeta = ThisMeta, $Adaptations extends
|
|
|
16
16
|
*/
|
|
17
17
|
as: (produce: Produce<Fabricated>) => Schema<$Meta, $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<$Meta, $Adaptations>>) => $Returnable) => Schema<$Meta, WithAdaptations<$Adaptations, AdaptationEntry<$Adapter, $Returnable>>>;
|
|
23
23
|
}
|
|
@@ -4,8 +4,8 @@ import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
|
4
4
|
export type Fabricated = symbol;
|
|
5
5
|
/**
|
|
6
6
|
* A symbol keyed via `keyed`, or unkeyed if `key` is absent, optionally
|
|
7
|
-
* overridden by an opaque `as` production — carried alongside `key` rather
|
|
8
|
-
*
|
|
7
|
+
* overridden by an opaque `as` production — carried alongside `key` rather than
|
|
8
|
+
* replacing it, so a prior keying survives `as` for future validation.
|
|
9
9
|
*/
|
|
10
10
|
export type Meta = {
|
|
11
11
|
key?: string;
|
|
@@ -20,18 +20,17 @@ export type Fabricator<$Schema extends {
|
|
|
20
20
|
schema: Schema<$Schema[typeof Meta]["items"], AdaptationsOf<$Schema>>;
|
|
21
21
|
};
|
|
22
22
|
/**
|
|
23
|
-
* `elements` are each slot's
|
|
23
|
+
* `elements` are each slot's _already-dispatched_ Fabricator, one per
|
|
24
24
|
* `[Meta].items` entry, built by `Constructor.ts`'s `make` before this call —
|
|
25
25
|
* mirrors `choice.Fabricator`'s `weightings`, one per option, rather than
|
|
26
26
|
* `array.Fabricator`'s single shared `element`. The `array`/`tuple`
|
|
27
|
-
* distinction: each slot gets its own private stream, so
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* sequentially off one shared stream).
|
|
27
|
+
* distinction: each slot gets its own private stream, so `T.tuple([T.number,
|
|
28
|
+
* T.number])` behaves like a two-field `object` of numbers, not a length-2
|
|
29
|
+
* `array` of numbers (every element drawn sequentially off one shared stream).
|
|
31
30
|
*
|
|
32
31
|
* `toStreamFromTrace` is only consulted on the `.as(...)`-overridden path: an
|
|
33
|
-
* ordinary tuple draws no randomness of its own — every draw belongs to a
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* ordinary tuple draws no randomness of its own — every draw belongs to a slot,
|
|
33
|
+
* exactly like `object`. `trace` is still recorded so a nested tuple can be
|
|
34
|
+
* replayed from its own schema.
|
|
36
35
|
*/
|
|
37
36
|
export declare function Fabricator<$Items extends Items>(context: FabricatorContext<Schema<$Items>>, elements: ReadonlyArray<NaiveFabricator<any>>): Fabricator<Schema<$Items>>;
|
|
@@ -4,9 +4,9 @@ import type { Produce } from "../../Random/Types";
|
|
|
4
4
|
import type { Core, Fabricated, Items } from "./Types";
|
|
5
5
|
/**
|
|
6
6
|
* Buildable `tuple` recipe: a fixed-length list of slot schemas, each
|
|
7
|
-
* fabricated independently — see `Fabricator.ts` for why that independence
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* fabricated independently — see `Fabricator.ts` for why that independence (one
|
|
8
|
+
* Fabricator per slot, not one reused across slots like `array`'s single
|
|
9
|
+
* element) is the defining difference from `array`.
|
|
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,40 +5,39 @@ import type { Adaptation, Kind, Meta, Produces } from "../../Types";
|
|
|
5
5
|
/** The schema occupying a single tuple slot. */
|
|
6
6
|
export type Item = AnySchema;
|
|
7
7
|
/**
|
|
8
|
-
* A
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* A _tuple_ of schemas, one per slot — not a flattened `ReadonlyArray`, for the
|
|
9
|
+
* same reason `choice.Items` isn't (see its doc): a widened array remembers
|
|
10
|
+
* only the union of every slot's type and loses arity and which slot held what.
|
|
11
|
+
* The real tuple is what lets `Fabricated` resolve to positional `[A, B]`
|
|
12
|
+
* rather than `(A | B)[]`, and `Adapter/TypeBox` produce a `TTuple` of the
|
|
13
|
+
* right length.
|
|
14
14
|
*/
|
|
15
15
|
export type Items = ReadonlyArray<Item>;
|
|
16
16
|
/**
|
|
17
|
-
* Head/tail recursion, not a homomorphic `{ [$K in keyof $Items]: ... }`
|
|
18
|
-
*
|
|
19
|
-
* `
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* `array.Fabricated` for the same bare case.
|
|
17
|
+
* Head/tail recursion, not a homomorphic `{ [$K in keyof $Items]: ... }` mapped
|
|
18
|
+
* type — the same trap `Adapter/TypeBox`'s `ChoiceOptions`/ `TupleItems` avoid:
|
|
19
|
+
* `keyof` a still-abstract `ReadonlyArray<Item>` (this type's default, and what
|
|
20
|
+
* a kind-local `Fabrication<$Fabricator>` resolves against for the _bare_,
|
|
21
|
+
* unparameterized `Fabricator`) pulls in `"length"`/method keys that don't
|
|
22
|
+
* resolve to a sensible `ValueOf`. A homomorphic version type-checks for any
|
|
23
|
+
* concrete tuple but silently produces a malformed bare type, which then fails
|
|
24
|
+
* `.schema.as`'s contravariant parameter check against any concrete
|
|
25
|
+
* instantiation (`Fabrication.types.test.ts`). Matching a fixed-length tuple
|
|
26
|
+
* pattern at every step avoids it, as `TupleItems` does for `ToTypeBox`. The
|
|
27
|
+
* fallback (a genuinely widened, arity-less array) is a plain `Array<...>`,
|
|
28
|
+
* mirroring `array.Fabricated` for the same bare case.
|
|
30
29
|
*/
|
|
31
30
|
export type Fabricated<$Items extends Items = Items, $Bindings extends unknown[] = []> = $Items extends readonly [] ? [] : $Items extends readonly [
|
|
32
31
|
infer $Head extends Item,
|
|
33
32
|
...infer $Rest extends Items
|
|
34
33
|
] ? [ValueOf<$Head, $Bindings>, ...Fabricated<$Rest, $Bindings>] : Array<ValueOf<$Items[number], $Bindings>>;
|
|
35
34
|
/**
|
|
36
|
-
* No `whereby`: arity is fixed at `T.tuple([...])` and there is nothing left
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
35
|
+
* No `whereby`: arity is fixed at `T.tuple([...])` and there is nothing left to
|
|
36
|
+
* configure. Unlike `array`'s two-variant union this needs no "config or
|
|
37
|
+
* produce" split — `produce` is a plain optional layered on top, and `items`
|
|
38
|
+
* stays required so `extend`-less kinds still have the per-slot shapes
|
|
39
|
+
* `ToTypeBox` derives from (and future validation of `produce` would check
|
|
40
|
+
* against).
|
|
42
41
|
*/
|
|
43
42
|
export type Meta<$Items extends Items = Items> = {
|
|
44
43
|
items: $Items;
|
|
@@ -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 — an `undefined` roll never advances `source`'s stream, and
|
|
24
|
+
* since `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>>;
|
|
@@ -4,31 +4,31 @@ 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 an `undefinable`: a single wrapped Schema, drawn
|
|
8
|
-
*
|
|
7
|
+
* The buildable recipe for an `undefinable`: a single wrapped Schema, drawn (or
|
|
8
|
+
* not) 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 `undefined`, 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
|
-
*
|
|
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
23
|
* `.weighted({ undefined: 0.1 })` shifts both outcomes' shares, not just
|
|
24
24
|
* `undefined`'s (see `Types.ts`'s `Weights`). Chaining `.weighted(...)`
|
|
25
|
-
* merges into previous weights rather than replacing them, the same
|
|
26
|
-
*
|
|
25
|
+
* merges into previous weights rather than replacing them, the same layering
|
|
26
|
+
* `.as(...)` 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,19 @@ export type Definition = AnySchema;
|
|
|
7
7
|
export type Fabricated<$Definition extends Definition, $Bindings extends unknown[] = []> = ValueOf<$Definition, $Bindings> | undefined;
|
|
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
|
-
*
|
|
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({ undefined: 0.1 })` is not
|
|
19
|
+
* "10% undefined, 90% present" — with `value` at default `1`, the split is `0.1
|
|
20
|
+
* / 1.1 ≈ 9.1%` undefined, `≈90.9%` value. No independent "absolute
|
|
21
|
+
* probability" mode; weights are only meaningful relative to the full set in
|
|
22
|
+
* play.
|
|
23
23
|
*/
|
|
24
24
|
export type Weights = {
|
|
25
25
|
undefined: number;
|
|
@@ -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;
|
|
@@ -3,13 +3,13 @@ import type { Adaptations, Adapter, Adapting, WithAdaptations } from "../../Adap
|
|
|
3
3
|
import type { Core, Meta as ThisMeta } from "./Types";
|
|
4
4
|
/**
|
|
5
5
|
* Nothing to configure (see `Types.ts`'s `Meta`), so `adapt` is this kind's
|
|
6
|
-
* only builder method — an external library that spells "undefined"
|
|
7
|
-
*
|
|
6
|
+
* only builder method — an external library that spells "undefined" differently
|
|
7
|
+
* still needs a way to say so.
|
|
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 = undefined;
|
|
4
4
|
/**
|
|
5
|
-
* Nothing to configure: `undefined` has exactly one possible value, so
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Nothing to configure: `undefined` has exactly one possible value, so there is
|
|
6
|
+
* no `.as()` (see `always/Types.ts` for the same reasoning) and no other knob
|
|
7
|
+
* to carry.
|
|
8
8
|
*/
|
|
9
9
|
export type Meta = Record<string, never>;
|
|
10
10
|
export type Core<$Meta extends Meta = Meta, $Adaptations extends Adaptations = {}> = {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { NumberGenerator } from "../Types";
|
|
2
2
|
/**
|
|
3
|
-
* sfc32 ("Small Fast Counter"): a 128-bit-state PRNG that is fast, compact,
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* sfc32 ("Small Fast Counter"): a 128-bit-state PRNG that is fast, compact, and
|
|
4
|
+
* statistically strong (passes both PractRand and TestU01 BigCrush). Each call
|
|
5
|
+
* advances the state and returns the top 32 bits scaled into `[0, 1)`.
|
|
6
|
+
* Non-cryptographic: never use this for secrets or tokens.
|
|
7
7
|
*
|
|
8
8
|
* @see https://stackoverflow.com/a/47593316
|
|
9
9
|
*/
|