1.2.85 • Published 1 year ago

ascertain v1.2.85

Weekly downloads
313
License
MIT
Repository
github
Last release
1 year ago

Ascertain

Ascertain what data is not suitable for your library

0-Deps, simple, blazing fast, for browser and Node.js object schema validator

Coverage Status Build Status NPM version Downloads Snyk

Features

  • Type-safe validation: Ensures your data conforms to predefined schemas.
  • Composite schemas: Supports logical AND, OR, and optional schemas.
  • Type casting: Automatically parses and casts strings to other types.
  • Error handling: Provides detailed error messages for invalid data.

Schema description

  • Primitive Values: Any primitive value (e.g., string, number, bigint, boolean, undefined, symbol, null) is used as an expected constant to match against.
  • Function Types: Functions are used as constructors for non-objects and instance types for object types.
  • Array Values: Arrays are used to represent an expected array type, where every item in the array must match the specified type (acting as an "and" operator).
  • Regular Expressions: Regular expressions are used to validate that a value matches a specified string pattern.
  • Object Types: Non-null objects are used as templates for expected properties, where each property of the object must match the corresponding schema definition.

Usage Example

Schema compilation

import { compile, optional, and, or, $keys, $values, Schema, as } from 'ascertain';

const validate = compile({
  number: Number,
  string: String,
  boolean: Boolean,
  function: Function,
  array: Array,
  object: Object,
  date: and(Date, { toJSON: Function }),
  regexp: /regexp/,
  oneOfValue: or(1, 2, 3),
  arrayOfNumbers: [Number],
  objectSchema: {
    number: Number,
  },
  optional: optional({
    number: Number,
  }),
  keyValue: {
    [$keys]: /^key[A-Z]/,
    [$values]: Number
  },
  parsedNumber: Number,
  parsedString: String,
  parsedBoolean: Boolean,
  parsedArray: [String],
  parsedJSON: {
    number: 1,
  },
  parsedBase64: String,
  parsedTime: 2 * 60 * 1000, // two minutes
  parsedDate: Date,
});

Runtime validation

Create data ascertain

import { ascertain, optional, and, or, $keys, $values, Schema, as } from 'ascertain';

// create data sample
const data = {
  number: 1,
  string: 'string',
  boolean: true,
  function: () => {},
  array: [],
  object: {},
  date: new Date,
  regexp: 'regexp',
  oneOfValue: 1,
  arrayOfNumbers: [1,2,3,4,5],
  objectSchema: {
    number: 1,
  },
  optional: null,
  keyValue: {
    keyOne: 1,
    keyTwo: 2,
    keyThree: 3,
  },
  // fault tolernat type casting
  parsedNumber: as.number('1'),
  parsedString: as.string('string'),
  parsedBoolean: as.boolean('false'),
  parsedArray: as.array('1,2,3,4,5', ','),
  parsedJSON: as.json('{ "number": 1 }'),
  parsedBase64: as.base64('dGVzdA=='),
  parsedTime: as.time('2m'),
  parsedDate: as.date('31-12-2024'),
};

// create data schema
const schema: Schema<typeof data> = {
  number: Number,
  string: String,
  boolean: Boolean,
  function: Function,
  array: Array,
  object: Object,
  date: and(Date, { toJSON: Function }),
  regexp: /regexp/,
  oneOfValue: or(1, 2, 3),
  arrayOfNumbers: [Number],
  objectSchema: {
    number: Number,
  },
  optional: optional({
    number: Number,
  }),
  keyValue: {
    [$keys]: /^key[A-Z]/,
    [$values]: Number
  },
  parsedNumber: Number,
  parsedString: String,
  parsedBoolean: Boolean,
  parsedArray: [String],
  parsedJSON: {
    number: 1,
  },
  parsedBase64: String,
  parsedTime: 2 * 60 * 1000, // two minutes
  parsedDate: Date,
};

// validate
const validate = ascertain<typeof data>(schema, data, '[DATA]');

Benchmark VS zod and ajv

⭐ Script ajv-vs-zod-vs-ascertain.js
  ⇶ Suite ajv vs zod vs ascertain
    ➤ Perform benchmark
      ✓ Measure 500000 zod static schema validation
        ┌──────────┬──────────┬──────────┬──────────┬────────────┬────────┐
        │ (index)  │ med      │ p95      │ p99      │ total      │ count  │
        ├──────────┼──────────┼──────────┼──────────┼────────────┼────────┤
        │ 0.000699 │ 0.000788 │ 0.000996 │ 0.001624 │ 462.602373 │ 500000 │
        └──────────┴──────────┴──────────┴──────────┴────────────┴────────┘
      ✓ Measure 500000 zod dynamic schema validation
        ┌──────────┬──────────┬──────────┬──────────┬─────────────┬────────┐
        │ (index)  │ med      │ p95      │ p99      │ total       │ count  │
        ├──────────┼──────────┼──────────┼──────────┼─────────────┼────────┤
        │ 0.006248 │ 0.006918 │ 0.007524 │ 0.016948 │ 3780.465563 │ 500000 │
        └──────────┴──────────┴──────────┴──────────┴─────────────┴────────┘
      ✓ Measure 500000 ascertain static schema validation
        ┌──────────┬──────────┬──────────┬──────────┬───────────┬────────┐
        │ (index)  │ med      │ p95      │ p99      │ total     │ count  │
        ├──────────┼──────────┼──────────┼──────────┼───────────┼────────┤
        │ 0.000063 │ 0.000071 │ 0.000098 │ 0.000267 │ 41.673271 │ 500000 │
        └──────────┴──────────┴──────────┴──────────┴───────────┴────────┘
      ✓ Measure 500000 ascertain dynamic schema validation
        ┌──────────┬──────────┬──────────┬──────────┬────────────┬────────┐
        │ (index)  │ med      │ p95      │ p99      │ total      │ count  │
        ├──────────┼──────────┼──────────┼──────────┼────────────┼────────┤
        │ 0.000367 │ 0.000415 │ 0.000525 │ 0.001055 │ 239.078129 │ 500000 │
        └──────────┴──────────┴──────────┴──────────┴────────────┴────────┘
      ✓ Measure 500000 ajv compiled schema validation
        ┌──────────┬──────────┬──────────┬──────────┬───────────┬────────┐
        │ (index)  │ med      │ p95      │ p99      │ total     │ count  │
        ├──────────┼──────────┼──────────┼──────────┼───────────┼────────┤
        │ 0.000063 │ 0.000072 │ 0.000124 │ 0.000307 │ 44.542936 │ 500000 │
        └──────────┴──────────┴──────────┴──────────┴───────────┴────────┘

License

License The MIT License Copyright (c) 2019-2024 Ivan Zakharchanka

1.2.85

1 year ago

1.2.84

1 year ago

1.2.81

1 year ago

1.2.82

1 year ago

1.2.80

1 year ago

1.2.83

1 year ago

1.2.78

1 year ago

1.2.79

1 year ago

1.2.76

1 year ago

1.2.77

1 year ago

1.2.75

1 year ago

1.2.74

1 year ago

1.2.72

1 year ago

1.2.73

1 year ago

1.2.69

1 year ago

1.2.70

1 year ago

1.2.71

1 year ago

1.2.67

1 year ago

1.2.68

1 year ago

1.2.66

1 year ago

1.2.63

1 year ago

1.2.64

1 year ago

1.2.65

1 year ago

1.2.60

1 year ago

1.2.61

1 year ago

1.2.62

1 year ago

1.2.59

1 year ago

1.2.58

1 year ago

1.2.57

1 year ago

1.2.56

1 year ago

1.2.54

1 year ago

1.2.55

1 year ago

1.2.53

1 year ago

1.2.52

1 year ago

1.2.49

1 year ago

1.2.50

1 year ago

1.2.51

1 year ago

1.2.45

2 years ago

1.2.46

2 years ago

1.2.44

2 years ago

1.2.47

1 year ago

1.2.48

1 year ago

1.2.41

2 years ago

1.2.42

2 years ago

1.2.40

2 years ago

1.2.43

2 years ago

1.2.39

2 years ago

1.2.38

2 years ago

1.2.34

2 years ago

1.2.35

2 years ago

1.2.36

2 years ago

1.2.37

2 years ago

1.2.33

2 years ago

1.2.32

2 years ago

1.2.31

2 years ago

1.2.29

2 years ago

1.2.30

2 years ago

1.2.28

2 years ago

1.2.23

2 years ago

1.2.24

2 years ago

1.2.21

2 years ago

1.2.22

2 years ago

1.2.27

2 years ago

1.2.25

2 years ago

1.2.26

2 years ago

1.2.18

2 years ago

1.2.19

2 years ago

1.2.20

2 years ago

1.2.12

2 years ago

1.2.13

2 years ago

1.2.10

2 years ago

1.2.11

2 years ago

1.2.16

2 years ago

1.2.17

2 years ago

1.2.14

2 years ago

1.2.15

2 years ago

1.2.8

2 years ago

1.2.9

2 years ago

1.2.7

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

0.14.31

2 years ago

1.1.0

2 years ago

0.14.30

2 years ago

0.14.35

2 years ago

0.14.34

2 years ago

0.14.33

2 years ago

0.14.32

2 years ago

0.15.0-0

2 years ago

0.14.39

2 years ago

0.14.38

2 years ago

0.14.37

2 years ago

0.14.36

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.0-0

2 years ago

0.14.28

2 years ago

0.14.29

2 years ago

0.14.24

2 years ago

0.14.27

2 years ago

0.14.26

2 years ago

0.14.25

2 years ago

0.14.23

2 years ago

0.14.22

2 years ago

0.14.21

2 years ago

0.14.20

2 years ago

0.14.19

2 years ago

0.14.18

2 years ago

0.14.17

2 years ago

0.14.16

2 years ago

0.14.15

2 years ago

0.14.13

2 years ago

0.14.14

2 years ago

0.14.12

2 years ago

0.14.11

2 years ago

0.14.10

2 years ago

0.14.9

2 years ago

0.14.8

2 years ago

0.14.7

2 years ago

0.14.6

2 years ago

0.14.5

2 years ago

0.14.4

2 years ago

0.14.3

2 years ago

0.14.2

2 years ago

0.14.1

2 years ago

0.14.0

2 years ago

0.13.4

2 years ago

0.13.3

2 years ago

0.13.2

2 years ago

0.13.1

2 years ago

0.13.0

2 years ago

0.12.31

2 years ago

0.12.32

2 years ago

0.12.33

2 years ago

0.12.30

2 years ago

0.12.29

2 years ago

0.12.28

2 years ago

0.12.27

2 years ago

0.12.26

2 years ago

0.12.25

2 years ago

0.12.24

2 years ago

0.12.10

3 years ago

0.12.11

3 years ago

0.12.16

3 years ago

0.12.17

3 years ago

0.12.18

3 years ago

0.12.19

3 years ago

0.12.12

3 years ago

0.12.13

3 years ago

0.12.14

3 years ago

0.12.15

3 years ago

0.12.20

3 years ago

0.12.21

3 years ago

0.12.22

3 years ago

0.12.23

3 years ago

0.12.7

3 years ago

0.12.8

3 years ago

0.12.9

3 years ago

0.12.6

3 years ago

0.12.5

3 years ago

0.12.3

3 years ago

0.12.4

3 years ago

0.12.0

3 years ago

0.12.1

3 years ago

0.12.2

3 years ago

0.10.3

3 years ago

0.11.0

3 years ago

0.10.1

3 years ago

0.10.2

3 years ago

0.9.23

3 years ago

0.9.21

3 years ago

0.9.22

3 years ago

0.9.17

3 years ago

0.9.18

3 years ago

0.9.19

3 years ago

0.9.20

3 years ago

0.9.12

4 years ago

0.9.13

4 years ago

0.9.14

4 years ago

0.9.15

4 years ago

0.9.10

4 years ago

0.9.11

4 years ago

0.9.16

3 years ago

0.9.8

4 years ago

0.9.9

4 years ago

0.10.0

4 years ago

0.9.2

4 years ago

0.9.7

4 years ago

0.9.4

4 years ago

0.9.3

4 years ago

0.9.6

4 years ago

0.9.5

4 years ago

0.8.9

4 years ago

0.8.8

4 years ago

0.8.7

4 years ago

0.9.0

4 years ago

0.9.1

4 years ago

0.8.10

4 years ago

0.8.5

4 years ago

0.8.4

4 years ago

0.8.6

4 years ago

0.8.3

4 years ago

0.8.2

4 years ago

0.7.31

4 years ago

0.7.30

4 years ago

0.8.1

4 years ago

0.8.0

4 years ago

0.7.22

4 years ago

0.7.21

4 years ago

0.7.24

4 years ago

0.7.23

4 years ago

0.7.20

4 years ago

0.7.29

4 years ago

0.7.26

4 years ago

0.7.25

4 years ago

0.7.28

4 years ago

0.7.27

4 years ago

0.7.19

4 years ago

0.7.18

5 years ago

0.7.17

5 years ago

0.7.16

5 years ago

0.7.15

5 years ago

0.7.14

5 years ago

0.7.13

5 years ago

0.7.12

5 years ago

0.7.11

5 years ago

0.7.10

5 years ago

0.7.9

5 years ago

0.7.8

5 years ago

0.7.7

5 years ago

0.7.6

5 years ago

0.7.5

5 years ago

0.7.2

5 years ago

0.7.1

5 years ago

0.7.4

5 years ago

0.6.5

5 years ago

0.7.3

5 years ago

0.6.4

5 years ago

0.7.0

5 years ago

0.6.3

5 years ago

0.6.2

5 years ago

0.6.1

5 years ago

0.6.0

5 years ago

0.5.9

5 years ago

0.5.8

5 years ago

0.5.7

6 years ago

0.5.6

6 years ago

0.5.5

7 years ago

0.5.4

7 years ago

0.5.3

7 years ago

0.5.2

7 years ago

0.5.1

7 years ago

0.5.0

7 years ago

0.4.0

7 years ago

0.3.0

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago