import { describe, expect, test } from 'bun:test';
import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
import { rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import {
dedupeVersionedPublicAssets,
pruneArchiveCacheGenerations,
rewriteSharedAssetReferences,
} from './docs-versioned-assets';
function tempDir() {
return mkdtempSync(join(tmpdir(), 'subminer-docs-versioned-assets-'));
}
describe('docs versioned asset dedupe', () => {
test('rewrites version-scoped public asset references to shared root assets', () => {
const html =
'';
const expected =
'';
expect(rewriteSharedAssetReferences(html, '/v/0.14.0/', new Set(['minecard.webm']))).toBe(
expected,
);
expect(rewriteSharedAssetReferences(html, '/v/0.14.0', new Set(['minecard.webm']))).toBe(
expected,
);
});
test('does not rewrite longer asset paths with a shared asset prefix', () => {
expect(
rewriteSharedAssetReferences(
[
'',
'',
'',
].join(''),
'/v/0.14.0/',
new Set(['foo.js']),
),
).toBe(
[
'',
'',
'',
].join(''),
);
});
test('removes duplicated version public assets while preserving generated VitePress assets', async () => {
const dir = tempDir();
try {
mkdirSync(join(dir, 'assets/chunks'), { recursive: true });
writeFileSync(join(dir, 'assets/style.hash.css'), 'body{}');
writeFileSync(join(dir, 'assets/chunks/theme.hash.js'), 'export {};');
writeFileSync(join(dir, 'assets/minecard.webm'), 'large video');
writeFileSync(
join(dir, 'index.html'),
'',
);
const result = dedupeVersionedPublicAssets({
outDir: dir,
base: '/v/0.14.0',
sharedAssetPaths: new Set(['minecard.webm']),
});
expect(result.rewrittenFiles).toEqual([join(dir, 'index.html')]);
expect(existsSync(join(dir, 'assets/style.hash.css'))).toBe(true);
expect(existsSync(join(dir, 'assets/chunks/theme.hash.js'))).toBe(true);
expect(existsSync(join(dir, 'assets/minecard.webm'))).toBe(false);
expect(readFileSync(join(dir, 'index.html'), 'utf8')).toBe(
'',
);
} finally {
await rm(dir, { recursive: true, force: true });
}
});
test('keeps root public assets because they are the shared copy', async () => {
const dir = tempDir();
try {
mkdirSync(join(dir, 'assets'), { recursive: true });
writeFileSync(join(dir, 'assets/minecard.webm'), 'large video');
const result = dedupeVersionedPublicAssets({
outDir: dir,
base: '/',
sharedAssetPaths: new Set(['minecard.webm']),
});
expect(result.removedAssetsDir).toBe(false);
expect(existsSync(join(dir, 'assets'))).toBe(true);
} finally {
await rm(dir, { recursive: true, force: true });
}
});
});
describe('docs archive cache pruning', () => {
test('removes stale cache generations while keeping the active generation', async () => {
const dir = tempDir();
try {
mkdirSync(join(dir, 'active123456-v0.14.0'), { recursive: true });
mkdirSync(join(dir, 'stale654321-v0.14.0'), { recursive: true });
mkdirSync(join(dir, 'stale654321-v0.13.0'), { recursive: true });
const removed = pruneArchiveCacheGenerations({
cacheRoot: dir,
activeCacheKey: 'active123456abcdef',
});
expect(removed.sort()).toEqual([
join(dir, 'stale654321-v0.13.0'),
join(dir, 'stale654321-v0.14.0'),
]);
expect(existsSync(join(dir, 'active123456-v0.14.0'))).toBe(true);
expect(existsSync(join(dir, 'stale654321-v0.14.0'))).toBe(false);
} finally {
await rm(dir, { recursive: true, force: true });
}
});
});