processSource = (datasource, table) => async () => {
		if (!server) {
			console.warn('missing ref to dev server');
			return;
		}
		server.hot.send(VITE_EVENTS.SOURCE_START, {
			id: `${datasource}.${table}`,
			toast: {
				id: `${datasource}.${table}`,
				status: 'info',
				message: `Loading ${datasource}.${table}`
			}
		});

		try {
			const updatedManifest = await evalSources(
				dataDirectory,
				metaDirectory,
				{
					sources: datasource ? new Set([datasource]) : null,
					queries: table ? new Set([table]) : null,
					only_changed: false
				},
				true
			);
			latestManifest = await updateManifest(updatedManifest, dataDirectory);

			server?.hot.send(VITE_EVENTS.SOURCE_END, {
				id: `${datasource}.${table}-end`,
				toast: {
					id: `${datasource}.${table}`,
					status: 'success',
					message: `Finished ${datasource}.${table}`
				}
			});
		} catch (e) {
			server?.hot.send(VITE_EVENTS.SOURCE_ERROR, {
				error: e instanceof Error ? e.message : e,
				toast: {
					id: `${datasource}.${table}`,
					status: 'error',
					message: `Failed to process ${datasource}.${table}`
				}
			});
		}
	}
@param {string | null} datasource
@param {string | null} table