async execute(customConfig = {}) {
    const cfg = {
      targetProjectPaths: null,
      optionA: false,
      optionB: '',
      ...customConfig,
    };

    /**
     * Prepare
     */
    const analyzerResult = await this._prepare(cfg);
    if (analyzerResult) {
      return analyzerResult;
    }

    /**
     * Traverse
     */
    const queryOutput = await this._traverse((ast, astContext) => {
      // Run the traversel per entry
      let transformedEntryResult = getResultPerAstFile(ast);
      const meta = {};

      // (optional): Post processors on TransformedEntry
      if (cfg.optionA) {
        // Run entry transformation based on option A
        transformedEntryResult = options.optionA(astContext);
      }

      return { result: transformedEntryResult, meta };
    });
    // (optional): Post processors on TransformedQueryResult
    if (cfg.optionB) {
      // Run your QueryResult transformation based on option B
    }

    /**
     * Finalize
     */
    return this._finalize(queryOutput, cfg);
  }
@param {AstDataProject[]} astDataProjects
@param {AnalyzerConfig} [customConfig]
@returns {QueryResult}