# Table of Contents

* [Architecture](#architecture)
* [Building](#building)
* [Testing](TESTING.md)
* [Usage](USAGE.md)

## Architecture

The source code is intended to be available through `src` (for testing), but bundled versions are provided to ensure portabilty:

- Both `cjs` and `es` modules are exported for NodeJS and modern Javascript environments respectively
- Standard `.js` and `.min.js` are emitted for browser usage, they're exported as `umd` without dependencies (`json-schema-ref-parser` and `jsonpath`)
- Also a single `.bundle.min.js` is generated containing both dependencies from above, also as `umd`

Generated sources are available as an [NPM dependency](https://www.npmjs.com/package/json-schema-faker) and through [UNPKG](https://unpkg.com/json-schema-faker@0.5.0-rc16/dist/).

```js
import jsf from 'json-schema-faker';
```

Let's examine how the library works:

```js
// 1.0 - first, we need a working (and valid) `schema`
const schema = {
  type: 'string',
};

// 1.1 - optionally, you can provide used `refs`
const refs = [
  {
    id: 'Test',
    type: 'boolean',
  }
];

// 1.2 - additionally, you can provide a `cwd` for local references
const cwd = `${__dirname}/schema`;
```

Note that:

- 1.0 — All input MUST be valid JSON-Schema
- 1.1 — Given `refs` are also valid JSON-Schema
- 1.2 — Given `cwd` is needed only if relative paths are used

Now we can produce values from our previous settings:

```js
// 2.0 - generate a sample from the given `schema`
const syncValue = jsf.generate(schema, refs);

// 2.1 - resolve and generate complex schemas with remote references
const asyncValue = await jsf.resolve(schema, refs, cwd);
```

The core provides typed generators for all basic types and well-known formats.

- 2.0 — Built-in generators can be resolved synchronously
- 2.1 — Local and remote references are resolved asynchronously

For more specific values `jsf` offers a rich menu of options and methods:

```js
// 3.0 - custom formats are supported
jsf.format('name', callback);
jsf.format('name', null); // unregister `name` format

// 3.1 - define `jsf` settings
jsf.option('optionName', 'value');
jsf.option({ optionName: 'value' });

// 3.2 - the `version` is also exported
jsf.version; // 0.5.0-rc16

// 3.3 - internal `random` generators
jsf.random; // { pick, date, shuffle, number, randexp }

// 3.4 - extend keywords with external generators
jsf.extend('chance', () => require('chance'));
jsf.extend('faker', () => require('faker'));

// 3.5 - extend keywords with custom generators
jsf.define('myProp', (value, schema) => schema);

// 3.6 - unregister extensions by keyword
jsf.reset('myProp');
jsf.reset(); // clear extensions

// 3.7 - retrieve registered extensions by keyword
jsf.locate('faker');
```

- 3.0 — This method should register non supported formats
- 3.1 — You should be able to setup custom behavior or defaults, etc.
- 3.2 — As convenience the package `version` should be exported
- 3.3 — Helpers should be shared too, to be used outside the API
- 3.4 — Third-party generators should be setup through this method (dependencies)
- 3.5 — Custom keywords like `autoIncrement` and `pattern` should be setup through this method (extensions) and stored in a shared container
- 3.6 — Added dependencies and extensions should be cleared from the container through this method, if no name is given the the entire container should be reset
- 3.7 — Any registered third-party generator should be returned through this method

### Available options

- `defaultInvalidTypeProduct` — If `failOnInvalidTypes` is disabled this value will be returned on any invalid `type` given (default: `null`)
- `defaultRandExpMax` — Setup default value directly as `RandExp.prototype.max` (default: `10`)
- `ignoreProperties` — Skip given properties from being generated (default: `[]`)
- `ignoreMissingRefs` — If enabled, it will resolve to `{}` for unknown references (default: `false`)
- `failOnInvalidTypes` — If enabled, it will throw an `Error` for unknown types (default: `true`)
- `failOnInvalidFormat` — If enabled, it will throw an `Error` for unknown formats (default: `true`)
- `alwaysFakeOptionals` — When enabled, it will set `optionalsProbability: 1.0` and ` fixedProbabilities: true` (default: `false`)
- `optionalsProbability` — A value from `0.0` to `1.0` to generate values in a consistent way, e.g. `0.5` will generate from `0%` to `50%` of values. Using arrays it means items, on objects they're properties, etc. (default: `false`)
- `fixedProbabilities` — If enabled, then `optionalsProbability: 0.5` will always generate the half of values (default: `false`)
- `useExamplesValue` — If enabled, it will return a random value from `examples` if they're present (default: `false`)
- `useDefaultValue` — If enabled, it will return the `default` value if present (default: `false`)
- `requiredOnly` — If enabled, only `required` properties will be generated (default: `false`)
- `minItems` — Override `minItems` if it's less than this value (default: `0`)
- `maxItems` — Override `maxItems` if it's greater than this value (default: `null`)
- `minLength` — Override `minLength` if it's less than this value  (default: `0`)
- `maxLength` — Override `maxLength` if it's greater than this value (default: `null`)
- `resolveJsonPath` — If enabled, it will expand `jsonPath` keywords on all generated objects  (default: `false`)
- `reuseProperties` — If enabled, it will try to generate missing properties from existing ones. Only when `fillProperties` is enabled too  (default: `false`)
- `fillProperties` — If enabled, it will try to generate missing properties to fulfill the schema definition (default: `true`)
- `random` — Setup a custom _randonmess_ generator, useful for getting deterministic results (default: `Math.random`)
- `replaceEmptyByRandomValue` — Remplace default empty value by a random value (default: `false`)

## Building

**JSON-Schema-Faker** is a JavaScript tool that can be executed both in the browser and the server.

It's built with [bili](https://github.com/egoist/bili), as we're using ES6 syntax for the source code and modules.

To generate `dist/` sources run:

```bash
$ npm run build
```

## Testing

Unit tests are run with `mocha -r esm` in order to use ES6 modules syntax, allowing to import and test code directly from the `src` folder.

Also we include "schema tests" to ensure generated data is also valid.

See our [reference guide](TESTING.md) to learn how.

## Usage

Use the [website](http://json-schema-faker.js.org/) tool and generate some values right now.

Please read our [guide](USAGE.md) for further usage instructions.