@namaste/kafka-schema-registry-cli
Version:
Utility app for registering schemas in Confluent Schema Registry
98 lines (87 loc) • 2.46 kB
JavaScript
const { SchemaRegistry } = require('@namaste/kafka-schema-registry-client');
const chalk = require('chalk');
const fs = require('fs');
const path = require('path');
const program = require('commander');
const pkg = require('../package.json');
const print = console.log;
const isDir = path => fs.statSync(path).isDirectory();
const walk = dir =>
fs
.readdirSync(dir)
.map(fileOrDir => path.resolve(path.join(dir, fileOrDir)))
.reduce(
(files, fileOrDir) =>
isDir(fileOrDir)
? files.concat(walk(fileOrDir))
: files.concat(fileOrDir),
[]
);
const validateOptions = ({ url, key, secret }) => {
if (!(url && key && secret)) {
print(chalk.red(`The following arguments are required:`));
!url && print(' - url');
!key && print(' - key');
!secret && print(' - secret');
print();
program.help();
process.exitCode = 2;
return false;
}
return true;
};
const validateDir = dir => {
const handleNotValid = isNotDir => {
isNotDir
? print(chalk.red(`${dir} is not a directory`))
: print(chalk.red(`${dir} does not exist`));
print();
program.help();
process.exitCode = 1;
return false;
};
try {
fs.accessSync(dir, fs.constants.F_OK);
if (!isDir(dir)) {
return handleNotValid(true);
}
} catch (err) {
return handleNotValid();
}
return true;
};
program
.name('register-schemas')
.version(pkg.version)
.option(
'-u, --url <registryUrl>',
'Confluent schema registry URL (or use SCHEMA_REGISTRY_URL environment variable)'
)
.option(
'-k, --key <key>',
'Confluent schema registry key (or use SCHEMA_REGISTRY_KEY environment variable)'
)
.option(
'-s, --secret <secret>',
'Confluent schema registry secret (or use SCHEMA_REGISTRY_SECRET environment variable)'
)
.arguments('[schemasDir]')
.parse(process.argv);
const {
url = process.env.SCHEMA_REGISTRY_URL,
key = process.env.SCHEMA_REGISTRY_KEY,
secret = process.env.SCHEMA_REGISTRY_SECRET,
args: [schemasDir = 'schemas'],
} = program;
const isDirValid = validateDir(schemasDir);
const isOptionsValid = validateOptions({ url, key, secret });
if (isDirValid && isOptionsValid) {
const schemaRegistry = new SchemaRegistry({
url,
auth: { username: key, password: secret },
});
walk(schemasDir).forEach(schemaInfo =>
schemaRegistry.publishSchemas(require(schemaInfo))
);
}