Record processors

The recordProcessor property in a control file allows custom code to be written to adjust Records after they have been read before executing the Instructions, for example, combining multiple files into one.


    "files": {
        // ...
    "recordProcessor": "example:combine-files"

Implementing a record processor service

A plugin must implement a Services named after the filter name in the control file, with a prefix of "haplo:data-import-framework:record-processor:".

The service takes a single argument of an array of objects with name and reader properties. The reader property is a function which when called with an iterator function as an argument, calls that iterator with each Record in order.

The service returns a similar array.


This example combines two input files. The main file contains most of the user details, but the “role” is provided in a separate file. As the user sync needs this in a single record, custom logic is required to combine the two files.

    function(readers) {

        let readerByName = {};
        readers.forEach((r) => { readerByName[] = r.reader; });

        // Mapping of staff ID => staff role
        let staffRoles = {};
        readerByName.staff_roles((row) => {
            staffRoles[row.ID] = row.ROLE_ID;

        // Make a new reader for users which adds in the extra info
        let combinedReader = function(iterator) {
            readerByName.users((user) => {
                let staffRole = staffRoles[user.ID];
                if(staffRole) {
                    user.staffRole = staffRole;

        // Replace the readers with this single combined reader
        return [{name:"users", reader:combinedReader}];