generateTree(files) {
		const depTree = {};
		const visited = {};
		const nonExistent = [];
		const npmPaths = {};
		const pathCache = {};

		files.forEach((file) => {
			if (visited[file]) {
				return;
			}

			Object.assign(depTree, dependencyTree({
				filename: file,
				directory: this.baseDir,
				requireConfig: this.config.requireConfig,
				webpackConfig: this.config.webpackConfig,
				tsConfig: this.config.tsConfig,
				visited: visited,
				filter: (dependencyFilePath, traversedFilePath) => {
					let dependencyFilterRes = true;
					const isNpmPath = this.isNpmPath(dependencyFilePath);

					if (this.isGitPath(dependencyFilePath)) {
						return false;
					}

					if (this.config.dependencyFilter) {
						dependencyFilterRes = this.config.dependencyFilter(dependencyFilePath, traversedFilePath, this.baseDir);
					}

					if (this.config.includeNpm && isNpmPath) {
						(npmPaths[traversedFilePath] = npmPaths[traversedFilePath] || []).push(dependencyFilePath);
					}

					return !isNpmPath && (dependencyFilterRes || dependencyFilterRes === undefined);
				},
				detective: this.config.detectiveOptions,
				nonExistent: nonExistent
			}));
		});

		let tree = this.convertTree(depTree, {}, pathCache, npmPaths);

		for (const npmKey in npmPaths) {
			const id = this.processPath(npmKey, pathCache);

			npmPaths[npmKey].forEach((npmPath) => {
				tree[id].push(this.processPath(npmPath, pathCache));
			});
		}

		if (this.config.excludeRegExp) {
			tree = this.exclude(tree, this.config.excludeRegExp);
		}

		return {
			tree: this.sort(tree),
			skipped: nonExistent
		};
	}
Generate the tree from the given files
@param  {Array} files
@return {Object}