fix: 0.1.0 사전 점검 차단 결함을 보정

공유 archive 마이그레이션과 런타임 설정 보존, AVIF 판별 및 문서 생성을 수정한다. 조건부 통합 격리를 보강하고 취약 의존성을 갱신하며 릴리스 메타데이터를 정리한다.
This commit is contained in:
2026-08-19 11:20:44 +00:00
parent b43d7601e7
commit 769d81f894
20 changed files with 1257 additions and 1888 deletions
+31
View File
@@ -1359,6 +1359,37 @@ describe('account self service', () => {
}
});
it('stores AVIF account icons with the public AVIF extension and media type', async () => {
const iconDir = await fs.mkdtemp(path.join(os.tmpdir(), 'sammo-account-icon-avif-'));
try {
const { caller, users, sessions, userIconUpload } = buildCaller({ userIconDir: iconDir });
const user = await users.createUser({
username: 'icon-avif',
password: 'current-password',
});
const session = await sessions.createSession(user);
const avif = await sharp({
create: { width: 64, height: 64, channels: 4, background: '#334455' },
})
.avif()
.toBuffer();
const result = await caller.account.changeIcon({
sessionToken: session.sessionToken,
imageData: `data:image/avif;base64,${avif.toString('base64')}`,
});
expect(result.iconUrl).toMatch(
/^https:\/\/sam-image\.hided\.net\/icons\/users\/core2026\/[a-f0-9]{32}\.avif$/
);
expect(userIconUpload.upload).toHaveBeenCalledWith(
expect.objectContaining({ contentType: 'image/avif', body: avif })
);
} finally {
await fs.rm(iconDir, { recursive: true, force: true });
}
});
it('atomically allows only one icon change per KST day and removes the losing file', async () => {
const iconDir = await fs.mkdtemp(path.join(os.tmpdir(), 'sammo-account-icon-race-'));
try {