async function providence(queryConfig, customConfig) {
  const tStart = performance.now();

  const cfg = /** @type {ProvidenceConfig} */ ({
    queryMethod: 'grep',
    // This is a merge of all 'main entry projects'
    // found in search-targets, including their children
    targetProjectPaths: null,
    referenceProjectPaths: null,
    // This will be needed to identify the parent/child relationship to write to
    // {outputFolder}/entryProjectDependencies.json, which will map
    // a project#version to [ depA#version, depB#version ]
    targetProjectRootPaths: null,
    gatherFilesConfig: {},
    report: true,
    debugEnabled: false,
    writeLogFile: false,
    skipCheckMatchCompatibility: false,
    measurePerformance: false,
    /** Allows to navigate to source file in code editor */
    addSystemPathsInResult: false,
    fallbackToBabel: false,
    fs: nodeFs,
    ...customConfig,
  });

  if (cfg.fs) {
    // Allow to mock fs for testing
    fsAdapter.setFs(cfg.fs);
  }

  if (cfg.debugEnabled) {
    LogService.debugEnabled = true;
  }

  if (cfg.referenceProjectPaths) {
    InputDataService.referenceProjectPaths = cfg.referenceProjectPaths;
  }

  if (cfg.fallbackToBabel) {
    AstService.fallbackToBabel = true;
  }

  const queryResults = await handleAnalyzer(queryConfig, cfg);

  if (cfg.writeLogFile) {
    LogService.writeLogFile();
  }

  const tEnd = performance.now();

  if (cfg.measurePerformance) {
    // eslint-disable-next-line no-console
    console.log(`completed in ${((tEnd - tStart) / 1000).toFixed(2)} seconds`);
  }
  return queryResults;
}
Creates a report with usage metrics, based on a queryConfig.

@param {QueryConfig} queryConfig a query configuration object containing analyzerOptions.
@param {Partial<ProvidenceConfig>} customConfig
@return {Promise<QueryResult[]>}