2.2
Model Data Hasil dan Enums
IResult adalah akar dari seluruh keluaran deteksi. Satu objek IResult selalu membawa satu string ua dan lima item turunan: browser, cpu, device, engine, serta os. Tidak ada item yang boleh bernilai undefined pada level ini; yang kosong adalah field-field di dalamnya (src/main/ua-parser.d.ts:48-551).
Kelima item itu berbagi satu kontrak yang sama, yaitu IData<T>, sehingga setiap item menyediakan is(val), toString(), withClientHints(), dan withFeatureCheck() (src/main/ua-parser.d.ts:14-192). Kontrak inilah yang membuat potongan seperti uap.getOS().is("Windows Phone") bisa ditulis tanpa memeriksa jenis itemnya.
Relasi IResult ke setiap item
erDiagram
IResult ||--|| IBrowser : "browser"
IResult ||--|| ICPU : "cpu"
IResult ||--|| IDevice : "device"
IResult ||--|| IEngine : "engine"
IResult ||--|| IOS : "os"
IResult {
string ua
}
IBrowser {
string name
string version
string major
string type
}
ICPU {
string architecture
}
IDevice {
string type
string vendor
string model
}
IEngine {
string name
string version
}
IOS {
string name
string version
}
%% fig: Relasi IResult ke lima item hasil
%% desc: Satu IResult memiliki tepat satu IBrowser, ICPU, IDevice, IEngine, dan IOS, masing-masing dengan field opsional yang sudah ditentukan tipenya.Semua field di dalam IBrowser, ICPU, IDevice, IEngine, dan IOS bersifat opsional. Parser dapat menghasilkan objek yang hanya berisi sebagian field ketika User-Agent tidak memuat informasi yang cukup (src/main/ua-parser.d.ts:21-553).
Bentuk field per item
Tabel berikut merangkum field yang mungkin muncul, termasuk atribut yang diisi khusus oleh parseUA() di runtime.
| Item | Field | Tipe | Catatan |
|---|---|---|---|
IResult | ua | string | string User-Agent yang dipakai parser |
IResult | browser, cpu, device, engine, os | item terkait | wajib ada, tidak opsional |
IBrowser | name, version, major | string | major diisi majorize(this.get(VERSION)) saat parseUA() |
IBrowser | type | BrowserTypes | turunan dari BrowserType |
ICPU | architecture | CPUArchs | turunan dari CPUArch |
IDevice | type | DeviceTypes | turunan dari DeviceType |
IDevice | vendor, model | string | tidak dibatasi enum |
IEngine | name | EngineNames | turunan dari EngineName |
IEngine | version | string | |
IOS | name, version | string | tidak dibatasi enum meski OSName tersedia |
Isi major berasal dari majorize() yang dipanggil pada cabang BROWSER di parseUA() (src/main/ua-parser.js:1296-13184). Perhatikan bahwa IOS.name dideklarasikan sebagai string biasa, bukan OSNames, berbeda dari IBrowser.type, ICPU.architecture, IDevice.type, dan IEngine.name yang dikunci ke tipe hasil typeof X[keyof typeof X] (src/main/ua-parser.d.ts:5-125).
Urutan dan atribut yang dipakai is() serta toString()
Factory defaultProps menentukan tiga hal sekaligus: field yang diinisialisasi, field yang dilewati is(), dan urutan field yang dipakai toString() (src/main/ua-parser.js:1085-11106).
| Item | Dilewati is() | Urutan toString() |
|---|---|---|
browser | version, major | name, version |
cpu | — | architecture |
device | — | vendor, model |
engine | version | name, version |
os | version | name, version |
Pelewatan itu membuat toString() pada browser menghasilkan "nama versi" saja, sementara major tetap tersedia sebagai field terpisah (src/main/ua-parser.js:1085-11106). Selain melewati field, is() juga menormalkan nilai: kedua sisi dibandingkan dalam bentuk lowercase, dan untuk browser serta os akhiran kata "browser" atau "os" dibuang lebih dulu lewat regex / ?browser$/i dan / ?os$/i (src/main/ua-parser.js:1099-11027).
withClientHints() dan withFeatureCheck()
Kedua method ini mengembalikan item yang sama setelah data diperkaya. withFeatureCheck() mendelegasikan ke item.detectFeature().get(), sedangkan withClientHints() bercabang: tanpa NAVIGATOR_UADATA ia memanggil item.parseCH().get() secara sinkron, dan pada browser berbasis Chromium 85+ ia memanggil getHighEntropyValues(CH_ALL_VALUES) lalu mengembalikan promise (src/main/ua-parser.js:1128-11508). Bentuk PromiseLike<T> | T pada deklarasi tipe mencerminkan percabangan runtime tersebut (src/main/ua-parser.d.ts:14-192). Karena itu, hasil withClientHints() perlu di-await bila berjalan di sisi client. Detail alur pemanggilannya ada di Alur Parsing User-Agent dan Client Hints.
Enums sebagai sumber nilai
Enum adalah objek beku (Object.freeze) yang nilainya dipakai ulang oleh tipe hasil maupun oleh kode deteksi. BrowserName dibekukan pada deklarasi pertamanya (src/enums/ua-parser-enums.js:109), dan berkas deklarasi hasil generate mempertahankan bentuk yang sama untuk seluruh enum (src/enums/ua-parser-enums.d.ts:14-18410).
graph LR
BrowserType["BrowserType"] --> browserType["IBrowser.type"]
CPUArch["CPUArch"] --> cpuArch["ICPU.architecture"]
DeviceType["DeviceType"] --> deviceType["IDevice.type"]
EngineName["EngineName"] --> engineName["IEngine.name"]
BrowserName["BrowserName"] -.-> browserName["IBrowser.name: string"]
OSName["OSName"] -.-> osName["IOS.name: string"]
style BrowserType fill:#f59e0b,color:#000
style CPUArch fill:#f59e0b,color:#000
style DeviceType fill:#f59e0b,color:#000
style EngineName fill:#f59e0b,color:#000
style browserType fill:#2d7d46,color:#fff
style cpuArch fill:#2d7d46,color:#fff
style deviceType fill:#2d7d46,color:#fff
style engineName fill:#2d7d46,color:#fff
style BrowserName fill:#8b5cf6,color:#fff
style OSName fill:#8b5cf6,color:#fff
style browserName fill:#8b5cf6,color:#fff
style osName fill:#8b5cf6,color:#fff
%% fig: Enum yang mengunci tipe field hasil
%% desc: Empat enum mengunci field hasil lewat tipe turunan, sementara BrowserName dan OSName hanya menjadi himpunan nilai rujukan untuk field bertipe string.Garis putus-putus menandai enum yang tidak diikat ke tipe field: IBrowser.name dan IOS.name tetap string, sehingga nilai BrowserName dan OSName hanya berguna sebagai pembanding di kode pemanggil (src/main/ua-parser.d.ts:21-553).
| Enum | Jumlah entri | Nilai contoh |
|---|---|---|
BrowserName | membentang dari key '115' sampai ZALO | CHROME: 'Chrome', FIREFOX: 'Firefox', SAFARI_MOBILE: 'Mobile Safari' |
BrowserType | 7 | crawler, cli, email, fetcher, inapp, mediaplayer, library |
CPUArch | 18 | X86: 'ia32', X86_64: 'amd64', ARM_64: 'arm64' |
DeviceType | 8 | console, mobile, smarttv, tablet, wearable, xr, embedded, desktop |
EngineName | 21 | BLINK: 'Blink', GECKO: 'Gecko', WEBKIT: 'WebKit' |
Rincian tiap himpunan nilai: BrowserType (src/enums/ua-parser-enums.d.ts:186-19411), CPUArch (src/enums/ua-parser-enums.d.ts:196-21512), DeviceType (src/enums/ua-parser-enums.d.ts:221-23313), dan EngineName (src/enums/ua-parser-enums.d.ts:329-35114).
⚠️
DeviceType.DESKTOPditandai@deprecateddengan alasan eksplisit bahwa UAParser tidak mendukung tipedesktop. Jangan memakainya sebagai nilai pembanding, karena parser tidak akan pernah menghasilkannya (src/enums/ua-parser-enums.d.ts:221-23313).
Nama enum lama yang masih diekspor
Setiap enum punya alias lama yang dipertahankan untuk kompatibilitas, dan semuanya ditandai @deprecated: Browser untuk BrowserName, CPU untuk CPUArch, Device untuk DeviceType, serta Engine untuk EngineName (src/enums/ua-parser-enums.d.ts:14-18410). Alias itu hanya meneruskan objek yang sama, misalnya const Engine = EngineName (src/enums/ua-parser-enums.d.ts:329-35114). Untuk kode baru, impor nama baru agar tidak bergantung pada alias yang bisa dihapus (src/enums/ua-parser-enums.d.ts:14-18410).
Bagaimana getResult() merakit kelima item
getResult() membuat UAItem bertipe RESULT, lalu mengisi ua dari string User-Agent dan menyalin hasil getBrowser(), getCPU(), getDevice(), getEngine(), serta getOS() ke properti dengan nama yang sama (src/main/ua-parser.js:1471-149015). Karena setiap item dirakit lewat getX() masing-masing, tipe yang dikembalikan konsisten dengan IResult pada deklarasi (src/main/ua-parser.d.ts:48-551).
⚠️ Meski
IResultmewarisiIData<IResult>, implementasi runtime hanya memasangis()dantoString()ketikaitemType != RESULT. Pada objek hasilgetResult(), kedua method itu tidak tersedia lewat prototipe; jangan memanggilnya pada objekIResult(src/main/ua-parser.js:1152-117516).
Untuk daftar method UAParser yang mengembalikan tipe-tipe ini, lihat API UAParser. Untuk enum tambahan yang hanya muncul saat memakai extensions, lihat Extensions untuk Deteksi Tambahan.