```ts
/**
 * Transcribes the source string using the provided table of rules.
 * @param source - The input string to transcribe.
 * @param table - An array of [pattern, output] pairs defining the transcription rules.
 * @returns The transcribed string.
 */
export function transcribeRunes(source: string, table: Array<[string, string]>): string {
    if (table.some(([pattern]) => pattern === "")) {
        throw new Error("A rule with an empty pattern is not allowed.");
    }

    let result = "";
    let position = 0;

    while (position < source.length) {
        const match = table.find(([pattern]) => source.startsWith(pattern, position));
        if (match) {
            const [pattern, output] = match;
            result += output;
            position += pattern.length;
        } else {
            result += source[position];
            position++;
        }
    }

    return result;
}
```