constructor(providedOptions, { preloadedPlugins } = {}) {
		const options = Object.assign(
			Object.create(null),
			defaultOptions,
			{ cwd: process.cwd() },
			providedOptions,
		);

		if (options.fix === void 0) {
			options.fix = false;
		}

		const additionalPluginPool = new Map();

		if (preloadedPlugins) {
			for (const [id, plugin] of Object.entries(preloadedPlugins)) {
				additionalPluginPool.set(id, plugin);
			}
		}

		const cacheFilePath = getCacheFile(
			options.cacheLocation || options.cacheFile,
			options.cwd,
		);
		const configArrayFactory = new CascadingConfigArrayFactory({
			additionalPluginPool,
			baseConfig: options.baseConfig || null,
			cliConfig: createConfigDataFromOptions(options),
			cwd: options.cwd,
			ignorePath: options.ignorePath,
			resolvePluginsRelativeTo: options.resolvePluginsRelativeTo,
			rulePaths: options.rulePaths,
			specificConfigPath: options.configFile,
			useEslintrc: options.useEslintrc,
			builtInRules,
			loadRules,
			getEslintRecommendedConfig: () =>
				require("@eslint/js").configs.recommended,
			getEslintAllConfig: () => require("@eslint/js").configs.all,
		});
		const fileEnumerator = new FileEnumerator({
			configArrayFactory,
			cwd: options.cwd,
			extensions: options.extensions,
			globInputPaths: options.globInputPaths,
			errorOnUnmatchedPattern: options.errorOnUnmatchedPattern,
			ignore: options.ignore,
		});
		const lintResultCache = options.cache
			? new LintResultCache(cacheFilePath, options.cacheStrategy)
			: null;
		const linter = new Linter({ cwd: options.cwd, configType: "eslintrc" });

		/** @type {ConfigArray[]} */
		const lastConfigArrays = [configArrayFactory.getConfigArrayForFile()];

		// Store private data.
		internalSlotsMap.set(this, {
			additionalPluginPool,
			cacheFilePath,
			configArrayFactory,
			defaultIgnores: IgnorePattern.createDefaultIgnore(options.cwd),
			fileEnumerator,
			lastConfigArrays,
			lintResultCache,
			linter,
			options,
		});

		// setup special filter for fixes
		if (options.fix && options.fixTypes && options.fixTypes.length > 0) {
			debug(`Using fix types ${options.fixTypes}`);

			// throw an error if any invalid fix types are found
			validateFixTypes(options.fixTypes);

			// convert to Set for faster lookup
			const fixTypes = new Set(options.fixTypes);

			// save original value of options.fix in case it's a function
			const originalFix =
				typeof options.fix === "function" ? options.fix : () => true;

			options.fix = message =>
				shouldMessageBeFixed(message, lastConfigArrays, fixTypes) &&
				originalFix(message);
		}
	}
Creates a new instance of the core CLI engine.
@param {CLIEngineOptions} providedOptions The options for this instance.
@param {Object} [additionalData] Additional settings that are not CLIEngineOptions.
@param {Record<string,Plugin>|null} [additionalData.preloadedPlugins] Preloaded plugins.