getDiffToFs = (fs, outputPath, currentAssets, callback) => {
	const directories = getDirectories(currentAssets);
	const diff = new Set();
	asyncLib.forEachLimit(
		directories,
		10,
		(directory, callback) => {
			/** @type {NonNullable<OutputFileSystem["readdir"]>} */
			(fs.readdir)(join(fs, outputPath, directory), (err, entries) => {
				if (err) {
					if (err.code === "ENOENT") return callback();
					if (err.code === "ENOTDIR") {
						diff.add(directory);
						return callback();
					}
					return callback(err);
				}
				for (const entry of /** @type {string[]} */ (entries)) {
					const file = entry;
					const filename = directory ? `${directory}/${file}` : file;
					if (
						!hasFile(directories, filename) &&
						!hasFile(currentAssets, filename)
					) {
						diff.add(filename);
					}
				}
				callback();
			});
		},
		err => {
			if (err) return callback(err);

			callback(null, diff);
		}
	);
}
@param {OutputFileSystem} fs filesystem
@param {string} outputPath output path
@param {Map<string, number>} currentAssets filename of the current assets (must not start with .. or ., must only use / as path separator)
@param {(err?: Error | null, set?: Diff) => void} callback returns the filenames of the assets that shouldn't be there
@returns {void}