1.0.6 • Published 10 months ago

avro-compatibility v1.0.6

Weekly downloads
-
License
MIT
Repository
-
Last release
10 months ago

A lightweight library for checking Avro schema compatibility.
Built on the backs of giants.
(Sits atop the amazing mtth/avsc)

šŸ  Homepage

Prerequisites

  • node >=18.18.0

Installation

npm install avro-compatibility

or

yarn add avro-compatibility

Usage

Validity Checks

Validates a string (or object) is valid Avro.

import { ValidityChecker } from 'avro-compatibility';

// Invalid Avro
const schemaInvalid = `{
  "name" : "Employee",
  "fields" : [
    { "name" : "Name" , "type" : "string" },
    { "name" : "Age" , "type" : "int" }
  ]
}`;

ValidityChecker.for(schemaInvalid).check(); // Returns false;

// Valid Avro
const schemaValid = {
  "type" : "record",
  "namespace" : "ValidityCheckerExample",
  "name" : "Employee",
  "fields" : [
    { "name" : "Name" , "type" : "string" },
    { "name" : "Age" , "type" : "int" }
  ]
};

ValidityChecker.for(schemaValid).check(); // Returns false;

Logging

You can log out the errors found during validity checks by supplying printValidityErrors.

ValidityChecker.for(schemaInvalid).check({ printValidityErrors: true });

Compatibility Checks

Validate whether or not a schema is compatible with previous versions of the schema given a particular compatibility mode. See the Confluent Docs on schema evolution for more information.

Schema lists passed into the compatibility checkers should be in descending order. As in, schemas[0] should be the newest previous version.

import { CompatibilityChecker, CompatibilityMode } from 'avro-compatibility';

const schema1 = {
    type: 'record',
    name: 'myrecord',
    fields: [{ type: 'string', name: 'f1' }],
};

const schema2 = {
    type: 'record',
    name: 'myrecord',
    fields: [
        { type: 'string', name: 'f1' },
        { type: 'string', name: 'f2', default: 'foo' },
    ],
};

const schema3 = {
    type: 'record',
    name: 'myrecord',
    fields: [
        { type: 'string', name: 'f1' },
        { type: 'string', name: 'f2' },
    ],
};

// Removing a field.
CompatibilityChecker
  .check(schema2) // New schema
  .against([schema1]) // Previous schemas
  .withCompatibility(CompatibilityMode.BACKWARD)
  .check(); // True

// Add a field without a default.
CompatibilityChecker
  .check(schema3) // New schema
  .against([schema1]) // Previous schemas
  .withCompatibility(CompatibilityMode.BACKWARD)
  .check(); // False

Supported compatibility modes.

CompatibilityMode.BACKWARD
CompatibilityMode.BACKWARD_TRANSITIVE
CompatibilityMode.FORWARD
CompatibilityMode.FORWARD_TRANSITIVE
CompatibilityMode.FULL
CompatibilityMode.FULL_TRANSITIVE
CompatibilityMode.NONE

Logging

You can log out the errors found during compatibility checks by supplying printCompatibilityErrors.

CompatibilityChecker.check(schema3)
  .against([schema1])
  .withCompatibility(CompatibilityMode.BACKWARD)
  .check({ printCompatibilityErrors: true })

Development

Install

yarn install

Tests

# Run tests.
yarn test

# Run tests with coverage.
yarn test:coverage

# Run lint and prettier.
yarn lint

# Fix lint errors than can be automatically resolved.
yarn format

Author

šŸ‘¤ Peter Myers

šŸ¤ Contributing

Contributions, issues and feature requests are welcome!Feel free to check issues page.

Show your support

Give a ā­ļø if this project helped you!

šŸ“ License

Copyright Ā© 2024 Peter Myers. This project is MIT licensed.

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago

1.0.3

10 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago