fetchAndApplyNodeUpdates = async ({
  since,
  throwFetchErrors = false,
  throwGqlErrors = false,
}) => {
  const { helpers, pluginOptions } = getGatsbyApi()

  const { cache, reporter } = helpers

  const activity = reporter.activityTimer(
    formatLogMessage(`pull updates since last build`)
  )
  activity.start()

  if (!since) {
    since = await cache.get(withPluginKey(LAST_COMPLETED_SOURCE_TIME))
  }

  // Check with WPGQL to create, delete, or update cached WP nodes
  const { wpActions, didUpdate } = await fetchAndRunWpActions({
    since,
    helpers,
    pluginOptions,
    throwFetchErrors,
    throwGqlErrors,
  })

  await touchValidNodes()

  activity.end()

  return { wpActions, didUpdate }
}
fetchAndApplyNodeUpdates

uses query info (types and gql query strings) fetched/generated in
onPreBootstrap to ask WordPress for the latest changes, and then
apply creates, updates, and deletes to Gatsby nodes