async resolveId(id, importer, _skip) {
			let originalId = id;
			const key = identifierPair(id, importer);

			const opts = {};
			for (const p of plugins) {
				if (!p.resolveId) continue;

				if (_skip) {
					if (_skip.includes(p)) continue;
					if (resolveSkips.has(p, key)) continue;
					resolveSkips.add(p, key);
				}

				plugin = p;

				let result;
				try {
					result = await p.resolveId.call(ctx, id, importer);
				} finally {
					if (_skip) resolveSkips.delete(p, key);
				}

				if (!result) continue;
				if (typeof result === 'string') {
					id = result;
				} else {
					id = result.id;
					Object.assign(opts, result);
				}

				logResolve(`${formatResolved(originalId, id)} [${p.name}]`);
				// resolveId() is hookFirst - first non-null result is returned.
				break;
			}

			opts.id = id;
			return Object.keys(opts).length > 1 ? opts : id;
		}
@param {string} id
@param {string} [importer]
@param {[Plugin]} [_skip] internal
@returns {Promise<import('rollup').ResolveIdResult>}