8cd2ef91d3
Три изолированных модуля по TDD (тест до кода) — заголовок/второй заголовок/текст (creativeLimits.ts), проверка ссылки (urlRule.ts) и проверка картинки (imageRule.ts + imageMeta.ts). Цифры и сообщения — порт 1:1 из app/app/Services/Advertising/CreativeValidator.php (единый источник лимитов Яндекс.Директа). 23 новых теста зелёные. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
import type { ImageMeta } from './imageRule';
|
|
|
|
/**
|
|
* Читает метаданные картинки (ширина/высота/вес/MIME) из выбранного файла через DOM Image.
|
|
* Не покрыт юнит-тестом (требует DOM Image/URL.createObjectURL) — проверяется вручную/e2e;
|
|
* чистая логика проверки лимитов покрыта тестами imageRule.spec.ts (checkImage).
|
|
*/
|
|
export function readImageMeta(file: File): Promise<ImageMeta> {
|
|
return new Promise((resolve, reject) => {
|
|
const objectUrl = URL.createObjectURL(file);
|
|
const image = new Image();
|
|
|
|
image.onload = () => {
|
|
const meta: ImageMeta = {
|
|
width: image.naturalWidth,
|
|
height: image.naturalHeight,
|
|
bytes: file.size,
|
|
mime: file.type,
|
|
};
|
|
URL.revokeObjectURL(objectUrl);
|
|
resolve(meta);
|
|
};
|
|
|
|
image.onerror = () => {
|
|
URL.revokeObjectURL(objectUrl);
|
|
reject(new Error('Не удалось прочитать изображение'));
|
|
};
|
|
|
|
image.src = objectUrl;
|
|
});
|
|
}
|