const { promisify } = require("util");

/** @type {import("../../../../").LoaderDefinitionFunction} */
exports.default = function (source) {
	const content = JSON.parse(source);
	// content is one reference or an array of references
	const refs = Array.isArray(content) ? content : [content];
	const callback = this.async();
	const loadModulePromise = promisify(this.loadModule.bind(this));

	async function loadReferencedModules() {
		// Modules are loaded sequentially as the false-positive circular reference
		// bug from https://github.com/webpack/webpack/issues/14379 doesn't occur if
		// they are loaded in parallel.
		const loadedRefs = []
		for(const ref of refs) {
			try {
				const source = await loadModulePromise("../loader!" + ref);
				loadedRefs.push([ref, JSON.parse(source)]);
			} catch(_err) {
				const err = /** @type {Error} */ (_err);
				loadedRefs.push([ref, `err: ${err && err.message}`]);
			}
		}
		return loadedRefs;
	}

	loadReferencedModules().then((loadResults) => {
		callback(null, JSON.stringify(loadResults));
	});
};
