API referansı

@thefinder/core

Sunucu motoru. Çalışma zamanı bağımlılığı yoktur; Web standardı Request → Response imzasıyla Node.js (≥ 18.17), Bun, Deno ve edge ortamlarında çalışır.

Giriş noktaları#

Alt yolİçerikOrtam
@thefinder/coreMotor, dosya sunucusu, hatalar, yardımcılar, tiplerHer yerde
@thefinder/core/locallocalDriver, LocalDriverNode.js, Bun (node:fs)
@thefinder/core/s3s3Driver, S3DriverHer yerde (Web Crypto + fetch)
@thefinder/core/nodetoNodeHandler, toExpress, toFastify, toKoa, toWebRequest, sendWebResponseNode.js
@thefinder/core/sharpsharpThumbnailer, sharpImagesNode.js, Bun; sharp (≥ 0.33) kurulu olmalı
@thefinder/core/clientcreateClient, TheFinderClient, ApiError. Bkz. client.mdTarayıcı ve sunucu

createTheFinder(options)#

import { createTheFinder } from "@thefinder/core";
import { localDriver } from "@thefinder/core/local";

const finder = createTheFinder({
  volumes: [{ id: "files", name: "Dosyalar", driver: localDriver({ root: "./uploads" }), url: "/uploads" }],
});

new TheFinder(options) ile aynıdır. Hatalı yapılandırmada (volume yok, aynı volume kimliği iki kez, S3 varken chunkSize < 5 MiB) hemen Error fırlatır.

TheFinderOptions#

SeçenekTipVarsayılanAçıklama
volumesVolumeOptions[]—Zorunlu, en az bir volume
chunkSizenumber5 MiBYükleme parça boyutu. S3 volume'ü varsa en az 5 MiB olmalı.
authorize(ctx) => AuthorizeResult \| Promise<…>—Her komuttan önce çalışır. Bkz. Yetkilendirme.
onBeforeCommand(ctx) => void \| Promise<void>—Yetkilendirmeden sonra, komuttan önce. Hata fırlatırsa komut çalışmaz.
onAfterCommand(ctx & { result }) => void \| Promise<void>—Komut başarıyla bittikten sonra. Dosya yanıtlarında result bir Response'tur.
onEntriesChanged(changes, ctx) => void \| Promise<void>—Var olan öğeleri taşıyan, silen, geri getiren ya da içeriğini değiştiren depolama işlemlerinden sonra. Bkz. Referansları güncel tutmak.
maxEditSizenumber5 MiBget / put (metin) için üst sınır
searchLimitnumber500search sonuç sınırı
thumbnailsThumbnailOptions—Sunucuda küçük resim. Bkz. Küçük resimler.
imagesImageProcessor—Toplu görsel işleme. Bkz. Görsel işleme.
maxImageSizenumber60 MiBtransform için en büyük girdi
maxExtractSizenumber4 GiBextract ile açılabilecek toplam boyut (zip bombası koruması)
csrfProtectionbooleantruePOST isteklerinde x-thefinder başlığını zorunlu tutar

VolumeOptions#

SeçenekTipVarsayılanAçıklama
idstring—Zorunlu. Harf, rakam ve tire, en fazla 32 karakter; kimliklerin öneki olur.
namestringidKök klasörün görünen adı
driverStorageDriver—Zorunlu
urlstring—Dosyaların herkese açık temel adresi ("/uploads", "https://cdn.example.com"). Verilirse her dosyada url alanı olur; arayüz önizlemede ve seçicide bunu kullanır.
readOnlybooleanfalseTüm yazma işlemlerini READ_ONLY ile reddeder. Çöp kutusu ve sürüm geçmişi de kapanır.
showHiddenbooleanfalseNokta ile başlayan dosyaları gösterir. Kapalıyken nokta ile başlayan isimler (.htaccess, .env...) oluşturulamaz, yüklenemez ve zip'ten çıkarılmaz. İç klasörler (.tf-*) her durumda gizli kalır.
allowExtensionsstring[]—Yalnızca bu uzantılar (küçük harf, noktasız). Boş ya da yoksa hepsi.
denyExtensionsstring[]—Yükleme, oluşturma, yeniden adlandırma, yapıştırma ve arşiv açmada reddedilen uzantılar
maxUploadSizenumber—Tek dosya için bayt sınırı (yükleme ve ikili put)
permission(action, path) => boolean—action: "read" \| "write" \| "delete". false döndürmek o yoldaki işlemi FORBIDDEN ile reddeder ve arayüzdeki read/write bayraklarını belirler. Klasör işlemleri içeriğe de uygulanır: içinde silinemeyen bir öğe olan klasör silinemez, okunamayan alt klasörler arama, boyut, zip indirme ve arşive girmez.
trashboolean \| { retentionDays? }true, 30 günfalse: silinen öğeler doğrudan silinir
versionsboolean \| { maxPerFile?, retentionDays? }true, 20 sürüm, süresizretentionDays: 0 süresiz saklar. false: sürüm alınmaz.

TheFinder örneği#

ÜyeAçıklama
handler(request): Promise<Response>Web standardı istek işleyici. Bun, Deno, Hono, Next.js route'ları ve Cloudflare Workers'ta doğrudan kullanılır; Node framework'leri için adaptörlere bakın. Bağlamı korumak için ok fonksiyonu olarak tanımlıdır: Bun.serve({ fetch: finder.handler }) güvenlidir.
execute<T>(cmd, params?, request?)Bir komutu HTTP olmadan çalıştırır; hook'lar ve authorize yine çalışır. Hata durumunda TheFinderError fırlatır. request verilmezse boş bir Request kullanılır.
getVolume(id)Volume örneğini döner (ileri düzey kullanım)
optionsVarsayılanları uygulanmış seçenekler
// Örnek: bir cron işinde 90 günden eski sürümleri temizlemek
await finder.execute("cleanup", { volume: "files", target: "versions", mode: "older", days: 90 });

Yetkilendirme#

type AuthorizeResult = boolean | void | { readOnly?: boolean };

interface CommandContext {
  cmd: string;                       // "ls", "upload"...
  request: Request;                  // gelen istek (çerez, başlık okunabilir)
  params: Record<string, unknown>;   // birleştirilmiş sorgu + gövde parametreleri
}
authorize sonucuEtki
true ya da undefinedİstek geçer
false403 FORBIDDEN
{ readOnly: true }İstek geçer ama bu istek için tüm volume'ler salt okunur olur. init yanıtında readOnly: true geldiği için arayüz yazma eylemlerini kendiliğinden gizler.
throw new TheFinderError("UNAUTHORIZED")401; arayüzde onUnauthorized çağrılır

Referansları güncel tutmak: onEntriesChanged#

Öğe kimlikleri yoldan üretilir (<volume>_<base64url(path)>), bu yüzden bir dosyanın adı değişince ya da taşınınca kimliği de değişir. Dosyalara kendi sabit kimliğiyle başvuran bir uygulama (örneğin uuid → path tablosu tutan bir CMS) bu tabloyu onEntriesChanged ile güncel tutabilir:

type EntryChange =
  | { type: "moved"; from: { volume: string; path: VolumePath }; to: { volume: string; path: VolumePath }; kind: EntryKind }
  | { type: "trashed"; volume: string; path: VolumePath; kind: EntryKind; trashId: string }
  | { type: "restored"; volume: string; trashId: string; path: VolumePath; kind: EntryKind }
  | { type: "deleted"; volume: string; path: VolumePath; kind: EntryKind } // çöpe uğramadan kalıcı silindi
  | { type: "purged"; volume: string; trashId: string } // çöpten kalıcı silindi
  | { type: "replaced"; volume: string; path: VolumePath }; // aynı dosya, aynı yol, yeni içerik

const finder = createTheFinder({
  volumes: [/* ... */],
  async onEntriesChanged(changes, ctx) {
    for (const c of changes) {
      // Klasör tek değişiklik olarak gelir: kendi yolunu ve `from.path + "/"` altındaki her yolu güncelleyin.
      if (c.type === "moved") await db.files.movePath(c.from, c.to);
      if (c.type === "trashed") await db.files.markTrashed(c.volume, c.path, c.trashId);
      if (c.type === "restored") await db.files.restore(c.volume, c.trashId, c.path);
      if (c.type === "deleted") await db.files.removePath(c.volume, c.path);
      if (c.type === "purged") await db.files.removeTrashed(c.volume, c.trashId);
      if (c.type === "replaced") await db.files.touch(c.volume, c.path);
    }
  },
});

EntryChange ve EntryKind ("file" | "dir") @thefinder/core'dan dışa aktarılır.

Ne zaman çağrılır

Olaylar

KomutDeğişiklik
renamemoved
cut ile paste (volume'ler arası da)moved. Volume'ler arasında kaynak silindiğinde bildirilir.
Var olan bir öğenin üzerine conflict: "overwrite" ile pasteDosya üzerine dosya: hedef için replaced (cut ise ardından moved). Diğer her durumda (klasörün yerine geçme ya da klasörün yerine dosya): orada olan öğe için deleted, çünkü içindekiler artık yok.
Çakışmasız ya da conflict: "rename" / "skip" ile kopyalayan pasteyok
rm (çöp açık)trashed
permanent: true ile ya da trash: false olan volume'de rmdeleted
restorerestored
ids ya da all: true ile purgeher öğe için purged
trash / purge: çöp okunurken retentionDays'i geçen öğeler siliniro komutun çağrısında purged
Bir dosyanın üzerine conflict: "overwrite" ile uploadson parça yerine yazıldığında replaced
id ile putreplaced
Var olan dosyada revertreplaced (silinmiş bir dosyayı geri getirmek onu oluşturur: yok)
Yerinde transform (output: "overwrite", aynı biçim)replaced
Kopya ya da başka biçim yazan transform, conflict: "overwrite" ile bir dosyanın üzerineo dosya için replaced; orijinal değişmez
Yeni kopya ya da başka biçim yazan transform, dryRunyok
mkdir, mkfile, duplicate, archive, extract (her zaman yeni bir klasöre), yeni dosya üreten upload / putyok

Hatalar. onAfterCommand gibi davranır: hata fırlatırsa istek hatayla döner (TheFinderError fırlatmadıkça 500 INTERNAL) ve onAfterCommand çalışmaz. Depolama işlemi o anda zaten yapılmıştır, yani istemci yapılmış bir iş için hata görür. Tablonuzun geride kalması kullanıcının isteğini düşürmemeliyse hatayı hook içinde yakalayın (ve örneğin yeniden denemeye kuyruklayın). Komutun kendisi hata verdiyse ve hook da fırlatırsa komutun hatası döner, hook'un hatası console.error ile yazılır.


Sürücüler#

localDriver(options), @thefinder/core/local#

SeçenekTipVarsayılanAçıklama
rootstring—Zorunlu. Volume kökü; göreli verilirse çalışma dizinine göre çözülür.
createbooleantrueKök klasör yoksa oluşturur
followSymlinksbooleantrueSymlink'leri izler. Kök dışını gösteren bağlantılar her zaman gizlenir ve erişimde FORBIDDEN verir.

s3Driver(options), @thefinder/core/s3#

SeçenekTipVarsayılanAçıklama
bucketstring—Zorunlu
accessKeyId, secretAccessKeystring—Zorunlu
sessionTokenstring—Geçici kimlik bilgileri için
regionstring"us-east-1"Cloudflare R2 için "auto"
endpointstringAWSS3 uyumlu servisler: R2, MinIO, DigitalOcean Spaces, Backblaze B2…
prefixstringbucket köküVolume kökü olarak kullanılacak anahtar öneki, örn. "uploads/"
forcePathStylebooleanözel endpoint'te true, AWS'de falseendpoint/bucket/key biçimli adresler
delivery"presigned" \| "proxy""presigned"Volume'de url yoksa dosyalar tarayıcıya nasıl ulaşır: kısa ömürlü presigned URL'e yönlendirme ya da sunucu üzerinden akış
presignExpiresInnumber3600Presigned URL ömrü (saniye)
partSizenumber8 MiBAkışla yazmada (arşiv, volume'ler arası kopya) multipart parça boyutu; en az 5 MiB
fetchtypeof fetchglobal fetchÖzel fetch (test, proxy)

StorageDriver arayüzü#

Yeni bir depolama (FTP, Azure Blob, Google Drive…) eklemek için bu arayüzü uygulamanız yeterlidir. Motor sürücüye her zaman normalize edilmiş yollar verir (/, /a/b.txt); sürücü .. görmez.

MetotZorunluAçıklama
kind✔Kısa ad ("local", "s3", "ftp"); arayüz ikon seçiminde kullanır
stat(path)✔DriverStat ya da yoksa null
list(path)✔Klasörün doğrudan çocukları
mkdir(path)✔Tek klasör oluşturur (üst klasör vardır)
read(path, range?)✔ReadableStream<Uint8Array>; range dahil-dahil bayt aralığıdır
write(path, data)✔data: ReadableStream, Uint8Array, ArrayBuffer ya da string. Varsa üzerine yazar.
remove(path)✔Dosyayı ya da klasörü özyinelemeli siler
copy(from, to)✔Özyinelemeli kopya; hedef yoktur
move(from, to)✔Taşıma / yeniden adlandırma; hedef yoktur (büyük/küçük harf farkı hariç)
uploadChunk(chunk)✔Bir yükleme parçasını yazar; { session, done } döner. session sürücüye özel durumdur, istemciye gidip bir sonraki parçayla geri gelir.
abortUpload(path, session)Yarım yüklemeyi temizler
hasSubdirs(path)Ağaçta açma okunun gösterilip gösterilmeyeceği
search(path, match, limit)Hızlı özyinelemeli arama; yoksa motor ağacı kendisi dolaşır
signedUrl(path, { download?, filename?, expiresIn? })Doğrudan URL (presigned). Bir URL dönerse motor dosyayı akıtmak yerine 302 ile yönlendirir.
capacity(){ total, free } ya da null
interface DriverStat { name: string; path: VolumePath; kind: "file" | "dir"; size: number; mtime: number /* ms */ }

interface UploadChunk {
  path: VolumePath;   // ilk parçada doğrulanmış ve çakışmasız hedef
  session?: string;   // önceki parçanın döndürdüğü durum; ilk parçada undefined
  index: number; total: number;
  size: number;       // dosyanın toplam boyutu
  offset: number;     // parçanın bayt konumu
  data: Uint8Array;
}

Küçük resimler#

import { sharpThumbnailer } from "@thefinder/core/sharp";

createTheFinder({ volumes, thumbnails: { generator: sharpThumbnailer(), sizes: [128, 256, 512] } });

ThumbnailOptions#

SeçenekTipVarsayılanAçıklama
generatorThumbnailer—Zorunlu
sizesnumber[][128, 256, 512]İzin verilen boyutlar; istekler en yakınına yuvarlanır
maxInputSizenumber40 MiBDaha büyük dosyalar küçük resme çevrilmez, orijinal gönderilir
concurrencynumber2Aynı anda en fazla kaç üretim yapılacağı

Küçük resimler volume'ün .tf-thumbs/ klasöründe tutulur. Kaynak değişince yeniden üretilir; dosya silinince, taşınınca ya da adı değişince temizlenir.

sharpThumbnailer(options?)#

SeçenekVarsayılanAçıklama
quality78WebP kalitesi
maxPixels120.000.000Bundan büyük görseller reddedilir (çözme bombası koruması)

Okuduğu biçimler: jpg, jpeg, jfif, png, webp, gif, avif, tif, tiff, heic, heif. EXIF yönünü uygular, oranı korur, büyütmez. sharp yüklenemezse API çalışmaya devam eder, günlüğe bir kez uyarı yazılır ve orijinal görseller gönderilir.

Thumbnailer arayüzü#

interface Thumbnailer {
  extensions: string[];      // okuyabildiği uzantılar (küçük harf)
  extension?: string;        // üretilen dosya uzantısı, varsayılan "webp"
  generate(input: Uint8Array, size: number): Promise<Uint8Array>; // size×size kutusuna sığdır
}

Görsel işleme#

import { sharpImages } from "@thefinder/core/sharp";

createTheFinder({ volumes, images: sharpImages() });

sharpImages(options?)#

SeçenekVarsayılanAçıklama
maxPixels120.000.000Çözme bombası koruması
effort4WebP/AVIF kodlama eforu (hız ↔ boyut)

Yazdığı biçimler: jpeg (mozjpeg), png (kalite < 100 ise paletli), webp, avif, gif. EXIF yönünü uygular, meta verileri siler, büyütmez. Kaynak ve hedef biçim destekliyorsa animasyon korunur. Bozuk girdide INVALID_IMAGE, piksel sınırında TOO_LARGE hatası verir. Aynı anda en fazla iki görsel işlenir, diğerleri sıra bekler.

ImageProcessor arayüzü#

interface ImageProcessor {
  extensions: string[];   // okuyabildiği uzantılar
  formats: ImageFormat[]; // yazabildiği biçimler: "jpeg" | "png" | "webp" | "avif" | "gif"
  transform(input: Uint8Array, options: ImageTransformOptions): Promise<{ data: Uint8Array; width: number; height: number }>;
}

interface ImageTransformOptions { format: ImageFormat; width?: number; height?: number; quality?: number /* 1–100, varsayılan 80 */ }

Dosya sunumu#

createFileServer(options)#

Bir sürücüdeki dosyaları bir URL öneki altında sunan Web standardı handler.

Bun.serve({ routes: { "/uploads/*": createFileServer({ driver, prefix: "/uploads" }) } });
SeçenekTipVarsayılanAçıklama
driverStorageDriver—Zorunlu
prefixstring""URL öneki
showHiddenbooleanfalseNokta dosyalarını sunar (.tf-* asla sunulmaz)
authorize(request, path) => boolean \| Promise<boolean>—false → 404 (özel dosyaların varlığı da gizlenir)
cacheControlstring"public, max-age=0, must-revalidate"

Range, ETag/304, HEAD, doğru Content-Type ve ?download desteklenir. HTML ve SVG gibi etkin içerikler Content-Security-Policy: sandbox ile sunulur. GET/HEAD dışındaki yöntemler 405 döner.

serveFile(options)#

Kendi route'unuzda dosya yanıtı üretmek için alt düzey yardımcı.

SeçenekTipAçıklama
requestRequestRange ve koşullu GET başlıkları buradan okunur
statDriverStatBoyut, tarih ve ETag için
open(range?) => Promise<ReadableStream>İçeriği açar
downloadbooleanattachment olarak gönderir
filenamestringContent-Disposition adı (varsayılan stat.name)
cacheControlstringVarsayılan "private, max-age=0, must-revalidate"
mimestringVarsayılan dosya adından tahmin edilir

Diğer yardımcılar: contentDisposition(type, filename) (RFC 6266/5987, UTF-8 adlar), parseRange(header, size) (ByteRange, "invalid" ya da null), etagOf(stat).


Node adaptörleri#

@thefinder/core/node. express.json() ya da koa-bodyparser gibi bir ayrıştırıcı gövdeyi önceden okumuşsa adaptör gövdeyi yeniden oluşturur.

FonksiyonKullanım
toNodeHandler(handler)http.createServer(toNodeHandler(finder.handler)). Express / Connect ara katmanı olarak da çalışır; hata olursa next(err) çağrılır.
toExpress(handler)toNodeHandler ile aynı: app.all("/api/files", toExpress(finder.handler))
toKoa(handler)router.all("/api/files", toKoa(finder.handler))
toFastify(handler, { path? })Fastify eklentisi: fastify.register(toFastify(finder.handler), { prefix: "/api/files" }). Kendi kapsamında gövde ayrıştırmayı kapatır; path varsayılanı "/".
toWebRequest(req)IncomingMessage → Request. x-forwarded-proto / x-forwarded-host dikkate alınır.
sendWebResponse(res, response)Response'u ServerResponse'a akıtır

Bir dosya sunucusunu da aynı şekilde bağlayabilirsiniz: app.get("/uploads/*", toExpress(createFileServer({ driver, prefix: "/uploads" }))).


Hatalar#

import { TheFinderError, isTheFinderError } from "@thefinder/core";

throw new TheFinderError("UNAUTHORIZED");           // mesaj varsayılanı kodun kendisi
throw new TheFinderError("FORBIDDEN", "Bu klasör size kapalı");
ÜyeAçıklama
code: ErrorCodeKodların tam listesi ve HTTP karşılıkları: protocol.md › Hata kodları
status: numberKoddan türetilen HTTP durumu
isTheFinderError(e)Tip koruyucu

Hook'larda ya da sürücülerde fırlatılan TheFinderError istemciye kendi kodu ve mesajıyla iletilir. Diğer hatalar INTERNAL olur ve ayrıntıları yalnızca sunucu günlüğüne yazılır.

Yardımcılar#

Dışa aktarımAçıklama
encodeId(volume, path) / decodeId(id)Kimlik üretme ve çözme. decodeId geçersiz girdide BAD_REQUEST fırlatır.
normalizePath(input)"a//b/./c" → "/a/b/c". .., ters bölü ve NUL içeren yolları çözmeye çalışmaz, BAD_REQUEST fırlatır.
joinPath(dir, name), dirname(path), basename(path)POSIX volume yolu işlemleri
extname(name)Noktasız, küçük harf uzantı; nokta dosyalarında ""
isInside(parent, child)child, parent'ın kendisi ya da altında mı
mimeOf(name)Uzantıdan MIME tipi (dahili tablo); bilinmiyorsa application/octet-stream
isActiveContent(mime)Tarayıcıda script çalıştırabilecek tipler (HTML, SVG, XML, JS)
createZipStream(sources)Bağımlılıksız, akışlı zip yazıcı (zip64 dahil). Zaten sıkıştırılmış biçimler sıkıştırılmadan eklenir.
readZipEntries(read, size) / openZipEntry(read, entry)Rastgele erişimli zip okuyucu; arşiv belleğe alınmaz
CSRF_HEADER"x-thefinder"
VERSIONPaket sürümü
TRASH_ROOT, THUMBS_ROOT, VERSIONS_ROOT"/.tf-trash", "/.tf-thumbs", "/.tf-versions"
isTrashPath(path), isVersionsPath(path), isReservedPath(path)Yol iç klasörlerden birinde mi
Volume, ThumbnailServiceMotorun iç sınıfları; ileri düzey kullanım içindir, API'leri küçük sürümlerde değişebilir
interface ZipSource {
  name: string;          // arşiv içi yol; klasörler "/" ile biter
  mtime: number;
  size?: number;         // çok büyük dosyalarda zip64 kararı için
  open?: () => Promise<ReadableStream<Uint8Array>>;
}

Tipler#

Tüm tipler import type { … } from "@thefinder/core" ile alınabilir. Tarayıcı kodunda aynı tipler @thefinder/core/client üzerinden de gelir.

Entry#

AlanTipAçıklama
idstringKimlik
parentstring \| nullÜst klasörün kimliği; volume kökünde null
volumestringVolume kimliği
namestringAd; volume kökünde volume'ün name'i
pathstringVolume yolu
kind"file" \| "dir"
sizenumberBayt; klasörlerde 0 (gerçek boyut için size komutu)
mtimenumberSon değişiklik (ms)
mimestringKlasörlerde "directory"
read, writebooleanreadOnly ve permission sonucuna göre izinler
locked?trueVolume kökü
hasDirs?booleanYalnızca tree yanıtında
url?stringVolume'de url tanımlıysa dosyanın doğrudan adresi
trash?{ id, originalPath, deletedAt }Yalnızca çöp kutusu yanıtlarında; path asıl konumdur

VolumeInfo#

{ id, name, kind, root: Entry, readOnly, maxUploadSize: number | null, allowExtensions: string[] | null, denyExtensions: string[], trash: { retentionDays, count } | null, versions: { maxPerFile, retentionDays } | null }

trash ve versions, o özellik kapalıysa null olur.

InitResult#

{ volumes: VolumeInfo[], chunkSize, version, thumbnails: { sizes, extensions } | null, images: { extensions, formats } | null }

FileVersion#

{ id, size, createdAt, reason }. reason sürümü neyin değiştirdiğini söyler: edit, upload, replace, optimize, revert…

StorageStats#

AlanAçıklama
volumeVolume kimliği
files, dirs, sizeYalnızca kullanıcı dosyaları (çöp, sürüm, önbellek hariç)
categoriesRecord<"image" \| "video" \| "audio" \| "document" \| "archive" \| "code" \| "other", { files, size }>
largestEn büyük dosyalar (Entry[]), büyükten küçüğe
versions{ files, count, size, orphaned, items: VersionedFile[] } (items en fazla 200)
trash{ count, size }
cache{ files, size }: küçük resim önbelleği
capacity{ total, free } \| null: sürücü bildirebiliyorsa disk
truncatedVolume tamamen taranamayacak kadar büyükse true
scannedAtTarama zamanı (ms)

VersionedFile: { id, path, name, exists, count, size, latest }. exists: false ise dosya silinmiş ya da theFinder dışında taşınmıştır, yani sürümleri sahipsizdir.

TransformResult#

AlanAçıklama
id, nameKaynak dosya
before, after?Kaynak ve sonuç boyutu (bayt)
width?, height?Sonuç ölçüleri
entry?Yazılan dosya (yerinde yazıldıysa kaynağın kendisi)
created?Kaynağın yanına yeni dosya oluşturulduysa true
skipped?"larger" (sonuç küçülmedi) ya da "unsupported" (biçim işlenemiyor)
error?Bu dosya başarısız olduysa hata kodu

Bu sayfa docs/api/tr/core.md dosyasından üretildi.