Fuzzing for io-ts codecs and types
npm install io-ts-fuzzer









io-ts-fuzzer lets you generate examples of a givenio-ts type.
Please note: API elements marked @experimental may be changed in breaking ways
(including removal) _without_ a major version release. Don't use such APIs if
that's not acceptable for you.
After yarn add fp-ts io-ts io-ts-fuzzer...
``typescript
import * as t from 'io-ts';
import * as fuzz from 'io-ts-fuzzer';
// Fuzzers for common types
const r = fuzz.createCoreRegistry();
// Type to fuzz
const target = t.union([t.string, t.type({ n: t.number, b: t.boolean })]);
// Builds a particular fuzzer from the registry.
const fuzzer = fuzz.exampleGenerator(r, target);
// Make examples. The input number and context
// fully determines the output example.
for (const n of new Array(10).keys()) {
console.log(JSON.stringify(fuzzer.encode([n, fuzz.fuzzContext()])));
}
`
See examples/quickstart/index.ts.
Currently supports (along with their closure under composition):
- t.arrayt.boolean
- t.exact
- t.Int
- t.intersection
- t.keyof
- t.literal
- t.null
- t.number
- t.partial
- t.readonly
- t.readonlyArray
- t.record
- t.recursive
- t.string
- t.tuple
- t.type
- (interface)t.undefined
- t.union
- t.unknown
- t.UnknownArray
- t.UnknownRecord
- t.void
-
If you yarn add monocle-ts io-ts-types and register theio-ts-types extra fuzzers viar.register(...await loadIoTsTypesFuzzers()), the following additional types
will be supported:
- dateBooleanFromString
- DateFromISOString
- DateFromNumber
- DateFromUnixTime
- IntFromString
- NonEmptyString
- NumberFromString
- UUID
- regexp
-
The following io-ts-types are composed of core types and you do not need toloadIoTsTypesFuzzers to fuzz them:
- eitheroption
-
Given a d = t.Decoder (aka a t.Type), fuzz.exampleGenerator willt.Encoder<[number,FuzzContext],I>
build a that will give example instances ofI. The example instances should all pass on d.decode (which should return an
identical example in the case of basic types). No exceptions should be thrown.
The FluentRegistry interface lets you easily configure certain core fuzzers,
currently:
- maximum array length (array, readonlyArray, UnknownArray)partial
- extra properties inserted into and type (interface) objectsunknown
- type used to fuzz typesrecord
- maximum record count (, UnknownRecord)
When fuzzing recursive types, you can provide to the context a
maxRecursionHint which specifies the requested maximum instantiations of any
recursive type in a single path. Note that this is the maximum depth of
_recursive_ types, not all types. If the recursive depth has been reached,
fuzzers that have a choice of which child(ren) to instantiate (like unions,
partials, or arrays) will attempt to choose children that won't recurse.
Note this is only a hint -- sometimes the type definition won't allow the fuzzer
to choose such a non-recursive path (and you'll get a stack limit error when
attempting to generate the actual example from the generator).
_TODO_
_TODO_
Read the LICENSE for details.
The entire NOTICE file serves as the NOTICE that must be included
under Section 4d of the License.
`
This product contains software originally developed by Holvonix LLC.
Original Repository: https://github.com/holvonix-open/io-ts-fuzzer
Copyright (c) 2019 Holvonix LLC. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this software except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Dependencies may have their own licenses.
``