src/target.ts
// Copyright (C) 2017-2019 Brainbean Apps OU (https://brainbeanapps.com).
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import { cloneDeep } from 'lodash'
import check from 'check-types'
import Ajv from 'ajv'
import ConfigDeclaration from './configDeclaration'
/**
* Target declaration
* Usually exposed as require('specific-dataplug').someCollection.target
*/
export default class Target {
private configDeclaration: ConfigDeclaration
private readonly _inputFactory: Function | undefined
/**
* @param configDeclaration Config declaration
* @param {Target~InputFactory} [inputFactory=] Input factory
*/
constructor(
configDeclaration: {} | ConfigDeclaration | Object,
inputFactory?: Function,
) {
this.configDeclaration = new ConfigDeclaration(configDeclaration)
this._inputFactory = inputFactory
}
/**
* Creates input stream instance
*
* @param params Parameters
* @returns {Writable|Writable[]} Input object stream(s) chain
*/
async createInput(params: Object) {
check.assert.object(params)
if (!this._inputFactory) {
throw new Error('No factory specified for this target')
}
params = cloneDeep(params)
const validator = new Ajv({
allErrors: true,
removeAdditional: true,
useDefaults: true,
}).compile(this.configDeclaration.toJSONSchema())
if (!validator(params)) {
throw new Error('Invalid parameters: ' + JSON.stringify(validator.errors))
}
return this._inputFactory(params)
}
}