function applyWatchChanges(absoluteId, changeType) {
		const event = { event: changeType };

		const seen = new Set();
		const items = [absoluteId];
		/** @type {string | undefined} */
		let item;
		while ((item = items.pop()) !== undefined) {
			if (seen.has(item)) continue;
			const res = NonRollup.watchChange(item, event);
			if (Array.isArray(res)) items.push(...res);
			seen.add(item);
		}

		const changed = Array.from(seen);
		for (let file of changed) {
			const originalFile = file;
			file = normalize(file);

			// Resolve potentially aliased paths and normalize to 'nix:
			const aliased = matchAlias(alias, file.split(sep).join(posix.sep));
			if (aliased) {
				// Trim leading slash, we need a relative path for the cache
				file = aliased.slice(1);
			} else {
				if (isAbsolute(file)) {
					const relativeFile = relative(root, file);
					if (!relativeFile.startsWith('..')) {
						file = relativeFile;
					}
				}

				file = file.split(sep).join(posix.sep);
			}

			logWatcher(`${kl.cyan(originalFile)} -> ${kl.dim(file)} [${changeType}]`);

			logCache(`delete: ${kl.cyan(file)}`);
			WRITE_CACHE.delete(file);

			// Delete source file if there is any
			if (options.sourcemap) {
				const sourceKey = file + '.map';

				if (WRITE_CACHE.has(sourceKey)) {
					logCache(`delete: ${kl.cyan(sourceKey)}`);
					WRITE_CACHE.delete(sourceKey);
				}
			}

			// We could be dealing with an asset
			if (WRITE_CACHE.has(file + '?asset')) {
				const cacheKey = file + '?asset';
				logCache(`delete: ${kl.cyan(cacheKey)}`);
				WRITE_CACHE.delete(cacheKey);
			}

			// ...or a proxy module
			if (WRITE_CACHE.has(file + '?module')) {
				const cacheKey = file + '?module';
				logCache(`delete: ${kl.cyan(cacheKey)}`);
				WRITE_CACHE.delete(cacheKey);
			}

			if (!pendingChanges.size) timeout = setTimeout(flushChanges, 60);

			if (moduleGraph.has(file + '?module')) {
				pendingChanges.add('/' + file + '?module');

				// Update files relying on the proxy module so that they
				// re-evaluate CSS module class names.
				bubbleUpdates(file + '?module');
			}

			if (STYLE_REG.test(file)) {
				pendingChanges.add('/' + file);
			} else if (/\.(mjs|[tj]sx?)$/.test(file)) {
				if (!moduleGraph.has(file)) {
					onChange({ reload: true });
					clearTimeout(timeout);
					return;
				}

				if (!bubbleUpdates(file)) {
					pendingChanges.clear();
					clearTimeout(timeout);
					onChange({ reload: true });
				}
			} else {
				pendingChanges.clear();
				clearTimeout(timeout);
				onChange({ reload: true });
			}
		}
	}
@param {string} absoluteId
@param {'create' | 'update' | 'delete'} changeType