feat(packages): i18n (#1708)

This commit is contained in:
Sam Potts
2026-07-10 12:58:47 +10:00
committed by GitHub
parent 5f48fcc6d6
commit 028dadb385
561 changed files with 13059 additions and 1320 deletions
@@ -1,18 +1,18 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { resolveVttSegment } from '../../../../media/dom/text/resolve-vtt-segment';
import { describe, expect, it, vi } from 'vitest';
import type { TextTrack } from '../../../../media/types';
import { createTextTrackSegmentLoaderActor } from '../../text-track-segment-loader';
import { createTextTracksActor } from '../text-tracks';
vi.mock('../../../../media/dom/text/resolve-vtt-segment', () => ({
resolveVttSegment: vi.fn((url: string) => {
type ResolveVttSegment = (url: string) => Promise<VTTCue[]>;
function createResolveVttSegment(): ReturnType<typeof vi.fn<ResolveVttSegment>> {
return vi.fn((url: string) => {
if (url.includes('fail')) {
return Promise.reject(new Error('Network error'));
}
return Promise.resolve([new VTTCue(0, 5, `Cue from ${url}`)]);
}),
destroyVttResolver: vi.fn(),
}));
});
}
function makeMediaElement(trackIds: string[]): HTMLMediaElement {
const video = document.createElement('video');
@@ -49,11 +49,8 @@ function makeResolvedTextTrack(id: string, segmentUrls: string[]): TextTrack {
}
describe('TextTrackSegmentLoaderActor', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('can be created and destroyed without error', () => {
const resolveVttSegment = createResolveVttSegment();
const video = makeMediaElement(['track-en']);
const textTracksActor = createTextTracksActor(video);
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
@@ -62,8 +59,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('does not fetch when no segments need loading', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
const video = makeMediaElement(['track-en']);
const textTracksActor = createTextTracksActor(video);
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
@@ -78,6 +74,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('delegates cue loading to TextTracksActor', async () => {
const resolveVttSegment = createResolveVttSegment();
const video = makeMediaElement(['track-en']);
const textTracksActor = createTextTracksActor(video);
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
@@ -96,8 +93,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('skips already-loaded segments on repeat send()', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
const video = makeMediaElement(['track-en']);
const textTracksActor = createTextTracksActor(video);
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);
@@ -116,7 +112,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('continues loading remaining segments after a fetch error', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
vi.mocked(resolveVttSegment)
.mockResolvedValueOnce([new VTTCue(0, 5, 'Good')])
.mockRejectedValueOnce(new Error('Network error'))
@@ -145,7 +141,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('preempts in-flight work when a new send() arrives', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
let resolveSeg0!: (cues: VTTCue[]) => void;
vi.mocked(resolveVttSegment)
@@ -187,7 +183,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('continues in-flight fetch when new send keeps the same segment in the plan', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
let resolveSeg0!: (cues: VTTCue[]) => void;
vi.mocked(resolveVttSegment)
@@ -242,7 +238,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('preempts in-flight fetch when new send drops it from the plan (e.g. seek out of window)', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
let resolveSeg0!: (cues: VTTCue[]) => void;
vi.mocked(resolveVttSegment)
@@ -296,8 +292,7 @@ describe('TextTrackSegmentLoaderActor', () => {
});
it('does not schedule work after destroy()', async () => {
const { resolveVttSegment } = await import('../../../../media/dom/text/resolve-vtt-segment');
const resolveVttSegment = createResolveVttSegment();
const video = makeMediaElement(['track-en']);
const textTracksActor = createTextTracksActor(video);
const actor = createTextTrackSegmentLoaderActor(textTracksActor, resolveVttSegment);