avro-compatibility v1.0.6
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-compatibilityor
yarn add avro-compatibilityUsage
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(); // FalseSupported compatibility modes.
CompatibilityMode.BACKWARD
CompatibilityMode.BACKWARD_TRANSITIVE
CompatibilityMode.FORWARD
CompatibilityMode.FORWARD_TRANSITIVE
CompatibilityMode.FULL
CompatibilityMode.FULL_TRANSITIVE
CompatibilityMode.NONELogging
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 installTests
# 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 formatAuthor
š¤ Peter Myers
- Github: @petermyers
š¤ 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.