handleTiddlerChange = (tRef, tObj, updates) => {

  if ($tw.wiki.isSystemTiddler(tRef)) {

    for (let path in rebuilders) {
      if (utils.startsWith(tRef, path) && !updates[path]) {
        $tm.logger('warn', '[System change]', path);
        rebuilders[path]();
        updates[path] = true;
      }
    }

  } else if (tObj) { // created or modified

    if (tObj.fields.text === undefined) { // sic; '' is ok
      // to make sure that the tiddler's body is fully loaded
      // we postpone the handling of the tiddler
      // see https://github.com/felixhayashi/TW5-TiddlyMap/issues/222#issuecomment-268978764
      $tw.wiki.dispatchEvent('lazyLoad', tRef);

      return false;
    }

    checkForClone(tObj);

    // call assignId IN ANY CASE to make sure the index
    // stays intact, also after a renaming operation
    $tm.tracker.assignId(tObj);

  } else { // deleted or renamed

    const id = $tm.tracker.getIdByTiddler(tRef);

    if (!id) { // ignore tiddler without id
      return false;
    }

    const tRefWithId = utils.getTiddlerWithField('tmap.id', id);

    if (tRefWithId) { // only renamed

      $tm.logger('warn', '[Renamed]', tRef, 'into', tRefWithId);

    } else { // removed

      // remove node; any edges pointing in/out; update indeces
      // CAREFUL with recursion here!
      $tm.adapter.deleteNode(id);

    }
  }

  return true;

}
This function will deal with tiddler changes and will log changes
to the provided `updates` object.

@param {TiddlerReference} tRef
@param {$tw.Tiddler} tObj
@param {Updates} updates