UNPKG

merge-drivers

Version:

Merge Drivers CLI: A command-line interface to conveniently manage custom git merge drivers

81 lines (67 loc) 2.13 kB
import fs from 'node:fs'; import path from 'node:path'; import YAML from 'yaml'; /** * @typedef {Object} MergeDriver * @property {string} name * @property {string} driver */ /** * @typedef {Object} MergeDriverDisabled * @property {string} [name] * @property {string} [driver] * @property {boolean} disabled */ /** * @typedef {Object} Config * @property {Object.<string, MergeDriver | MergeDriverDisabled>} merge-drivers */ /** * Asserts that the `config` object is valid and contains expected properties. * * @param {unknown | Config} config * @returns {asserts config is Config} */ export function assertConfigIsValid(config) { if (!config || typeof config !== 'object') { throw new Error('Config is missing'); } const assertedConfig = /** @type {Config} */ (config); if (!('merge-drivers' in assertedConfig)) { throw new Error('Config is missing merge-drivers property'); } Object.entries(assertedConfig['merge-drivers']).forEach( ([key, mergeDriver]) => { if (!mergeDriver || typeof mergeDriver !== 'object') { throw new Error( `Merge driver for \`${key}\` is invalid. It's likely empty, provide at least a name and driver properties or disable it by setting disabled: true`, ); } // A merge driver is invalid if it is not disabled and does not contain a name and driver property. if ( !('disabled' in mergeDriver) && (!mergeDriver.name || !mergeDriver.driver) ) { throw new Error( `Merge driver for \`${key}\` is invalid, missing name or driver property`, ); } }, ); } /** * Reads the configuration from the specified `filePath` and returns it as an asserted `Config` object. * * @param {string} fileName * @returns {Config} */ export function readConfig(fileName) { const filePath = path.resolve(process.cwd(), fileName); if (!fs.existsSync(filePath)) { throw new Error(`Config file not found: ${filePath}`); } const file = fs.readFileSync(filePath, 'utf8'); const config = YAML.parse(file); assertConfigIsValid(config); return config; }