Detaylı İngilizce dokümantasyon README.md dosyasındadır. Bu dosya aynı içeriğin Türkçe sürümüdür.
validare, adlandırılmış JSON şemaları, doğrudan şema nesneleri, Express middleware yapıları ve tarayıcı tarafı form doğrulaması etrafında tasarlanmış bir TypeScript ve JavaScript doğrulama kütüphanesidir.
Sistem yüksek seviyede dört iş yapar:
- Doğrulama şemalarını ve mesaj dosyalarını yükler.
- Bir şemayı isimle veya satır içi nesne olarak çözer.
- Türe özel doğrulama zincirini çalıştırır.
- Hata anahtarı, sebep, orijinal değer ve isteğe bağlı mesaj içeren yapılandırılmış bir durum nesnesi döndürür.
Depo iki çalışma tarzını destekler:
- Node.js ve Express tarafında
validationConfig,validator,Schema,validateFieldsvevalidateSwitchile kullanım. - Tarayıcı tarafında
dist/validare-web.js, uzaktan JSON şema yükleme vedata-validatekullanan input alanlarında DOM tabanlı otomatik doğrulama.
Ana giriş noktası şu sembolleri dışa aktarır:
| Export | Amaç |
|---|---|
schema |
Desteklenen şema biçimlerini tanımlayan type export'u. |
Schema |
Bir şema nesnesini saran sınıf. validate, create_id ve random sağlar. |
validationConfig |
Node.js kullanımı için çalışma zamanı şema ve mesaj yüklemesini başlatır. |
validator |
Ana doğrulama fonksiyonu. Şema nesnesi veya şema adı alır ve Status döndürür. |
ID |
create_id için alias. String şema ayarlarından ID üretir. |
validateFields |
Birden fazla request veya response alanını doğrulayan Express middleware üreticisi. |
validateSwitch |
Başka bir alanın değerine göre doğrulama kümesi seçen Express middleware üreticisi. |
validateFile |
Dosya doğrulaması için dışa aktarılan Express middleware. Mevcut implementasyon şimdilik yer tutucudur. |
validate_element |
DOM input'u veya CSS selector hedefini doğrulayan tarayıcı yardımcısı. |
validate_inner_keys |
İç içe nesne anahtarlarının varlığını ve null olmamasını kontrol eden yardımcı. |
loadValidareMessages |
Node.js içinde bir klasördeki mesaj JSON dosyalarını yükler. |
get_schema |
Standart çözümleme akışından geçerek isimle bir şemayı döndürür. |
Şemalar JSON dosyalarında tutulabilir ve global.validare içine yüklenebilir.
Örnek şema dosyası:
{
"username": {
"type": "string",
"regex": {
"pattern": "^[a-zA-Z0-9]+$",
"flag": "g"
},
"min_length": 3,
"max_length": 30
}
}Daha sonra isimle doğrulama yapılabilir:
import { validationConfig, validator } from 'validare';
await validationConfig({
files: ['requiments.json'],
messages: 'messages'
});
const result = await validator('username', 'alice01');Şemayı global olarak kaydetmeden doğrudan nesne ile doğrulama da yapılabilir.
import { validator } from 'validare';
const result = await validator(
{
type: 'url',
protocols: ['https'],
hostnames: ['example.com']
},
'https://example.com/docs'
);Her doğrulama şu çalışma zamanı yapısına sahip bir Status nesnesi döndürür:
{
status: boolean;
error: string;
reason: any;
value: any;
message: string;
}Alanların anlamı:
status: başarı içintrue, hata içinfalse.error:type,min_lengthveyainvalidgibi makine dostu hata anahtarı.reason: mümkün olduğunda hataya sebep olan şema değeri.value: orijinal giriş değeri.message: yüklenmiş mesaj JSON dosyalarından çözülen yerelleştirilmiş veya özelleştirilmiş mesaj.
Çalışma sırasını anlamak önemlidir çünkü bazı seçenekler diğerlerinin önüne geçer.
validator şu iki biçimi kabul eder:
- Bir şema nesnesi.
- Yüklenmiş şemalardan çözülen string isim.
İsimle verilen bir şema bulunamazsa, kütüphane şu varsayılan şemaya düşer:
{ type: 'string', required: true }validator üçüncü argüman olarak şu yapıyı kabul eder:
{ dont_validate: string[] }Listelenen her anahtar doğrulama başlamadan önce şemadan silinir.
Örnek:
await validator('username', 'ALICE', {
dont_validate: ['casetype']
});Türe özel doğrulama çalışmadan önce şu bayraklar kontrol edilir:
dont_validate_empty: değer''ise doğrulama hemen başarılı kabul edilir.allow_undefined: değerundefinedise doğrulama hemen başarılı kabul edilir.allow_null: değernullise doğrulama hemen başarılı kabul edilir.
Eğer required: true varsa kütüphane şunları reddeder:
undefinediçinundefinedhatasınulliçinnullhatası
Önemli detay: allow_undefined ve allow_null, required kontrolünden önce çalışır. İkisi birlikte varsa izin veren kural kazanır.
Normal şema tiplerinde kütüphane src/validator/validators.ts içindeki fonksiyon dizisini bulur ve sırayla çalıştırır.
İlk başarısız fonksiyon zinciri durdurur ve nihai Status nesnesi oluşturulur.
type, multi-type ise kütüphane types içindeki her şemayı sırayla dener.
Hiçbiri başarılı olmazsa not-matched-with-any-type döndürülür.
validationConfig, sunucu tarafı kullanım için standart başlangıç girişidir.
import { validationConfig } from 'validare';
await validationConfig({
files: ['requiments.json'],
messages: 'messages'
});Seçenekler:
| Seçenek | Tür | Anlam |
|---|---|---|
files |
`string | string[]` |
messages |
string |
Mesaj JSON dosyalarını içeren klasör yolu. |
Yaptıkları:
global.validare = {}ile çalışma alanını başlatır.- Şema dosyalarını
validareisim alanına yükler. - Verilen klasördeki tüm mesaj JSON dosyalarını okuyup
global.validare.messagesiçine birleştirir.
Pratik kullanım önerisi:
- İlk doğrulama çağrısından önce
validationConfigfonksiyonunuawaitile bekleyin. - Uygulama açılışında bir kez çağırın.
Tarayıcı kullanımı dist/validare-web.js içindeki UMD bundle ve hangi JSON dosyalarının çekileceğini söyleyen meta etiketleri üzerine kuruludur.
Örnek sayfa:
<meta
name="validare-schemas"
dist="/test"
schemas='"a.json","b.json","c.json"'
>
<meta
name="messages"
dist="/messages"
schemas='"messages.json"'
>
<input data-validate data-message-box="message" name="username" type="text">
<p id="message"></p>
<script src="/dist/validare-web.js"></script>Tarayıcı derlemesinde olanlar:
validare-schemasmeta etiketinde listelenen tüm şema JSON dosyaları çekilir.messagesmeta etiketinde listelenen tüm mesaj dosyaları çekilir.- Yüklenen tüm nesneler tarayıcı belleğinde birleştirilir.
DOMContentLoadedanındadata-validatekullanan tüm elemanlar bulunur.- Her alan hemen doğrulanır; sonra
change,focusoutvekeyupolaylarında yeniden doğrulanır.
validate_element şu öznitelikleri kullanır:
| Öznitelik | Anlam |
|---|---|
data-validate |
Otomatik doğrulamayı açar. Boş değilse değeri şema adı olarak kullanılır. Boşsa name özniteliği kullanılır. |
name |
data-validate boş olduğunda yedek şema adı. |
data-message-box |
Mesajın yazılacağı elemanın id değeri. |
Doğrulama sonrası hedef eleman şu öznitelikleri alır:
data-validation-status:'true'veya'false'data-validation-full-result: tümStatusnesnesinin JSON hali
Tüm şemalar ortak global bayraklar da içerebilir.
| Seçenek | Tür | Anlam |
|---|---|---|
required |
boolean |
undefined ve null değerlerini reddeder. |
dont_validate_empty |
boolean |
'' değeri geldiğinde diğer tüm doğrulamaları atlayıp başarılı kabul eder. |
allow_undefined |
boolean |
undefined değerini hemen kabul eder. |
allow_null |
boolean |
null değerini hemen kabul eder. |
name |
string |
Mesaj çözümleme için kullanılan açık şema adı. |
Bu iki seçenek farklı şeyler yapar.
dont_validate_empty, boş string değerini kabul eder ve doğrulama başarıyla biter.ignore_empty, bazı doğrulayıcılarda boş string içinemptyhatası üretir.
İsim yanıltıcı olsa da mevcut implementasyonda ignore_empty, doğrulamayı atlamaz; hata üretir.
Desteklenen seçenekler:
| Seçenek | Tür | Not |
|---|---|---|
regex |
{ pattern: string, flag: string } |
new RegExp(pattern, flag) ile test edilir. |
ignore_empty |
boolean |
'' için empty döndürür. |
chars |
string |
String doğrulamasında kullanılmaz. ID üretim yardımcılarında kullanılır. |
casetype |
`'uppercase' | 'lowercase' |
ignored |
string[] |
Listedeki tam eşleşmeleri ignored hatasıyla reddeder. |
min_length |
number |
value.length kullanır. |
max_length |
number |
value.length kullanır. |
length |
number |
Tam value.length eşleşmesi ister. |
Pipeline sırası:
validate_onlytypeignore_emptyvalidate_stringvalidate_lengthvalidate_casevalidate_igonered
Bu tipten gelebilecek hata anahtarları:
typeemptyregexlengthmin_lengthmax_lengthlowercaseuppercasecombinedignored
Örnek:
{
"username": {
"type": "string",
"regex": {
"pattern": "^[a-zA-Z0-9_]+$",
"flag": "g"
},
"min_length": 3,
"max_length": 20,
"casetype": "unset",
"ignored": ["admin", "root"]
}
}Desteklenen seçenekler:
| Seçenek | Tür | Not |
|---|---|---|
min_length |
`number | string` |
max_length |
`number | string` |
length |
`number | string` |
base |
number |
Sadece string-number ayrıştırmasında kullanılır. |
Pipeline sırası:
| Tür | Pipeline |
|---|---|
number |
validate_onlytype -> validate_numbers |
bigint |
validate_onlytype -> validate_numbers |
string-number |
validate_numbers |
Sayı doğrulayıcısı şu tür tarih ifadelerini destekler:
{
"type": "number",
"max_length": "date 1:minute:add"
}Bu ifade karşılaştırmadan önce Date.now() + 1 dakika olarak çözülür.
Önemli detay:
- Bu tiplerde
min_length,max_lengthvelength, string uzunluğu değil sayısal karşılaştırma değeridir.
Desteklenen seçenekler:
| Seçenek | Tür | Not |
|---|---|---|
min_length |
number |
value.length kontrolü yapar. |
max_length |
number |
value.length kontrolü yapar. |
length |
number |
value.length kontrolü yapar. |
Pipeline sırası:
validate_onlytypevalidate_length
Önemli detay:
typeof []değeri'object'olsa da array içintype: 'array'kullanılmalıdır.validate_length,value.lengthbeklediğinden düz nesneler için uzunluk odaklı doğrulama uygun değildir.
Pipeline sırası:
validate_onlytype
Olası hata anahtarı:
type
Pipeline sırası:
validate_onlytype
Bu, değerin gerçekten undefined olması gereken özel durumlar için niş bir şema tipidir.
Desteklenen seçenekler:
| Seçenek | Tür | Not |
|---|---|---|
services |
string[] |
Yakalanan domain servis kısmını sınırlar. |
ignore_empty |
boolean |
'' için empty döndürür. |
min_length |
number |
String uzunluğu kullanılır. |
max_length |
number |
String uzunluğu kullanılır. |
length |
number |
Tam string uzunluğu aranır. |
Pipeline sırası:
ignore_emptyvalidate_emailvalidate_length
Olası hata anahtarları:
emptyinvalidserviceslengthmin_lengthmax_length
Pipeline sırası:
ignore_emptyvalidate_ipvalidate_length
Mevcut implementasyon IPv4 adreslerini regex ile doğrular.
Pipeline sırası:
ignore_emptyvalidate_phonevalidate_length
Mevcut implementasyon dar kapsamlı, rakam odaklı bir regex kullanır; tam bir uluslararası telefon ayrıştırıcısı değildir.
Desteklenen seçenekler:
| Seçenek | Tür | Anlam |
|---|---|---|
hostnames |
string[] |
İzin verilen hostname listesi. |
ignored_hostnames |
string[] |
Reddedilen hostname listesi. |
protocols |
string[] |
Sonundaki : olmadan izin verilen protokoller. |
ports |
number[] |
İzin verilen açık portlar. |
origins |
string[] |
https://example.com gibi izin verilen origin değerleri. |
ignore_empty |
boolean |
'' için empty döndürür. |
min_length |
number |
String uzunluğu kullanılır. |
max_length |
number |
String uzunluğu kullanılır. |
length |
number |
Tam string uzunluğu aranır. |
Pipeline sırası:
ignore_emptyvalidate_urlvalidate_length
Olası hata anahtarları:
emptyinvalidprotocolsportsoriginshostnameslengthmin_lengthmax_length
Desteklenen seçenekler:
| Seçenek | Tür |
|---|---|
values |
any[] |
Pipeline sırası:
validate_values
Örnek:
{
"status": {
"type": "values",
"values": ["draft", "published", "archived"]
}
}Desteklenen seçenekler:
| Seçenek | Tür | Anlam |
|---|---|---|
possible_types |
schema[] |
Her eleman listedeki şemalardan en az birine uymalıdır. |
max_element |
number |
Eleman sayısı üst sınırı. |
min_element |
number |
Eleman sayısı alt sınırı. |
max_element_eq |
number |
Mevcut kodda max_element ile aynı mantıkta implement edilmiştir. |
min_element_eq |
number |
Mevcut kodda min_element ile aynı mantıkta implement edilmiştir. |
Pipeline sırası:
validate_array
Olası hata anahtarları:
typemax_elementmin_elementpossible_types
Örnek:
{
"tags": {
"type": "array",
"min_element": 1,
"max_element": 5,
"possible_types": [
{
"type": "string",
"min_length": 2,
"max_length": 20
}
]
}
}Desteklenen seçenekler:
| Seçenek | Tür |
|---|---|
min_size |
number |
max_size |
number |
Pipeline sırası:
validate_base64
Önemli detay:
min_sizevemax_size, decode edilmiş byte uzunluğu yerine base64 string uzunluğu ile karşılaştırılır.
Desteklenen seçenekler:
| Seçenek | Tür |
|---|---|
ignore_empty |
boolean |
min_length |
number |
max_length |
number |
length |
number |
Pipeline sırası:
ignore_emptyvalidate_doi
Implementasyon DOI odaklı bir regex kullanır.
Desteklenen seçenekler:
| Seçenek | Tür | Anlam |
|---|---|---|
casetype |
`'uppercase' | 'lowercase' |
allowed_chars |
string |
Harf olmayan ama tek tek izin verilen ekstra karakterler. |
ignore_empty |
boolean |
'' için empty döndürür. |
min_length |
number |
String uzunluğu kullanılır. |
max_length |
number |
String uzunluğu kullanılır. |
length |
number |
Tam string uzunluğu aranır. |
Pipeline sırası:
validate_unicode_nameignore_emptyvalidate_lengthvalidate_case
Önemli detay:
- İlk adım her karakteri Unicode harf kontrolünden geçirir. Harf olmayan karakterler ancak
allowed_charsiçinde varsa kabul edilir.
Desteklenen seçenekler:
| Seçenek | Tür |
|---|---|
min_length |
number |
max_length |
number |
length |
number |
Pipeline sırası:
validate_lengthvalidate_latex
KaTeX, throwOnError: true ile kullanıldığı için geçersiz LaTeX için invalid döndürülür.
Desteklenen seçenekler:
| Seçenek | Tür | Anlam |
|---|---|---|
extension |
`string | string[]` |
mime |
`string | string[]` |
max_size |
`{ size: number, size_type: 'bit' | 'kib' |
min_size |
max_size ile aynı yapı |
Minimum dosya boyutu. |
Pipeline sırası:
validate_file- Uzantı veya MIME kısıtı varsa
validate_mime_extension - Boyut kısıtı varsa
validate_size
Doğrudan kullanım örneği:
import { readFileSync } from 'fs';
import { validator } from 'validare';
const buffer = readFileSync('avatar.png');
const result = await validator(
{
type: 'file',
extension: ['png', 'jpg'],
max_size: { size: 2, size_type: 'mb' }
},
buffer
);Önemli detay:
- Alttaki doğrulayıcı doğrudan kullanımda
Bufferbekler.
Desteklenen seçenekler:
| Seçenek | Tür |
|---|---|
types |
schema[] |
Örnek:
{
"website": {
"type": "multi-type",
"types": [
{
"type": "url"
},
{
"type": "values",
"values": [":delete-value"]
}
]
}
}Mesajlar JSON dosyalarından yüklenir ve tek bir mesaj nesnesinde birleştirilir.
Örnek:
{
"$default": {
"length": "Bu değer #{value} uzunluğunda olmalı"
},
"username": {
"$default": "Bu değer geçersiz",
"min_length": "Kullanıcı adı en az #{value} karakter olmalı"
}
}Status içindeki çözümleme sırası:
- Şemaya özel hata mesajı:
messages[name][error] - Şemaya özel varsayılan mesaj:
messages[name]['$default'] - Global hata mesajı:
messages['$default'][error]
#{value} yer tutucusu, reason alanındaki değer ile değiştirilir.
Bu yardımcı birden fazla değeri doğrulayan ve tüm hataları toplayan middleware üretir.
String kısayolu:
['body.username', 'body.email', 'body.password?']Kısayolun davranışı:
- Noktalı yol varsayılan olarak
reqüzerinden çözülür. - İlk segment
reqveyaresise çözümleme açıkça oradan başlar. - Son segment şema adı olarak kullanılır.
- Sondaki
?, bu alan içinallow_undefined: trueanlamına gelir.
Nesne biçimi:
[
{ dataname: 'body.login', schema: 'username' },
{ dataname: 'body.email', schema: 'email', allow_undefined: true }
]Callback imzası:
(invalidValues, req, res) => anyHer hata kaydı şu alanları içerir:
{
data: any;
dataname: string;
error: string;
reason: any;
message: string;
}Örnek:
import express from 'express';
import { validateFields } from 'validare';
const app = express();
app.post(
'/users',
validateFields(
['body.username', 'body.email', 'body.password?'],
(invalidValues, req, res) => {
return res.status(400).json({ errors: invalidValues });
}
),
(req, res) => {
res.json({ ok: true });
}
);Bu yardımcı başka bir alanın çalışma zamanındaki değerine göre alan kümesi seçer.
Örnek:
validateSwitch(
'body.type',
{
business: ['body.taxNumber', 'body.companyName'],
personal: ['body.firstName', 'body.lastName'],
$default: ['body.firstName']
},
(invalidValues, req, res) => {
return res.status(400).json({ errors: invalidValues });
}
)Bu fonksiyon dışa aktarılır, ancak mevcut kaynak kodunda doğrudan next() çağırır ve herhangi bir dosya doğrulaması yapmaz.
Öneri:
- Şimdilik yüklenen dosya buffer'ını
validator({ type: 'file', ... }, buffer)ile manuel doğrulayın.
Schema sınıfı bir şema nesnesini sarar ve kolaylık metodları sunar.
Örnek:
import { Schema } from 'validare';
const usernameSchema = new Schema({
type: 'string',
min_length: 3,
max_length: 20
});
const result = await usernameSchema.validate('alice');Sarılan şema ile ana doğrulayıcıyı çağırır.
String şema ayarlarını kullanarak ID üretir.
ID üretiminde anlamlı olan şema alanları:
lengthchars
src/create-id/presets.ts içindeki chars preset'leri:
allstandartA-Za-z0-90-f0-Fbinary
Preset isimleri ile ek karakterleri aynı string içinde birleştirebilirsiniz.
Örnek:
import { ID } from 'validare';
const token = await ID({
type: 'string',
length: 16,
chars: 'A-Z0-9'
});Bu yardımcı pratikte sadece şu tiplerde anlamlıdır:
numberbigintstring-number
İçeride max_length, min_length ve length değerlerini dahili rastgele sayı üreticisine iletir.
Pratik uyarı:
- Implementasyon basit bir sayısal rastgele üreticidir; tüm şema tipleri için örnek veri üreten genel bir sistem değildir.
lengthverilirse bu değer basamak sayısı olarak değil sayısal üst sınır olarak kullanılır.
İsimle verilen bir şemayı validator içindeki çözümleme mantığıyla döndürür.
Noktalı bir yolun var olup olmadığını ve tüm adımlarda null olmadan ilerleyip ilerlemediğini kontrol eder.
Örnek:
const ok = await validate_inner_keys('profile.address.city', payload);Express middleware içinde kullanılan dahili yardımcıdır.
Çözümleme kuralları:
req.body.email,reqüzerinden başlar.res.locals.user,resüzerinden başlar.body.emaildereqüzerinden başlar çünkü varsayılan kökreq'dir.
| Yol | Rol |
|---|---|
src/index.ts |
Ana giriş noktası ve export yüzeyi. |
src/validator |
Ana doğrulama motoru ve doğrulayıcı kayıtları. |
src/validator/validators |
Her doğrulayıcı için ayrı klasörler. |
src/class |
Schema ve Status sınıfları. |
src/express-middlewares |
Express entegrasyon yardımcıları. |
src/functions |
Şema yükleme, mesaj yükleme, DOM entegrasyonu ve genel yardımcılar. |
src/types |
TypeScript şema ve middleware tip tanımları. |
dist/validare-web.js |
Webpack tarafından üretilen tarayıcı bundle'ı. |
build |
Webpack girdisi olarak kullanılan derlenmiş JavaScript çıktısı. |
messages |
Örnek mesaj JSON dosyaları. |
test |
Tarayıcıdan yüklenen örnek şema parçaları. |
package.json içindeki mevcut script'ler:
| Script | Komut | Anlam |
|---|---|---|
npm run tsc |
tsc ./test.ts --outDir ./build -w |
Mevcut test iskeleti etrafında TypeScript watch derlemesi. |
npm run nodemon |
nodemon ./build/test.js |
Derlenen test script'ini çalıştırır. |
Webpack şu anda build/index.js dosyasını dist/validare-web.js içine UMD biçiminde ve validare kütüphane adıyla bundle eder.
Bu bölüm mevcut davranışı kodun implement ettiği haliyle açıklar.
validateFilemiddleware'i tamamlanmamıştır. Export edilir ama doğrulama yapmaz.ignore_empty, boş string içinemptyhatası üretir; boş değeri yok saymaz.- Sayısal şema tiplerinde
min_length,max_lengthvelength, basamak sayısı değil sayısal karşılaştırma değerleridir. base64boyut kontrolleri decode edilmiş byte uzunluğu yerine encode edilmiş string uzunluğu ile yapılır.validatorile doğrudan dosya doğrularken giriş olarakBufferverilmelidir.- Dosya boyutu yardımcısı şu an minimum boyutun altındaki değerlerde de
max_sizedöndürür; mevcut implementasyon davranışı budur. array.max_element_eqvearray.min_element_eq, şu andamax_elementvemin_elementile aynı kıyas mantığıyla çalışır;_eqeki farklı bir eşitlik semantiği getirmez.objectuzunluk kontrolüvalue.lengthkullandığından sadece bu özelliğe sahip nesnelerde anlamlıdır.- Tarayıcı tarafı şema yükleme, tam olarak
validare-schemasvemessagesmeta etiket adlarına bağlıdır. - Bir hata için mesaj bulunamazsa
Status.messageboş kalabilir.
import express from 'express';
import { validationConfig, validateFields } from 'validare';
await validationConfig({
files: ['requiments.json'],
messages: 'messages'
});
const app = express();
app.use(express.json());
app.post(
'/register',
validateFields(
['body.username', 'body.email'],
(invalidValues, req, res) => {
return res.status(400).json({ errors: invalidValues });
}
),
(req, res) => {
res.json({ ok: true });
}
);import { validator } from 'validare';
const result = await validator(
{
type: 'multi-type',
types: [
{ type: 'url', protocols: ['https'] },
{ type: 'values', values: [':delete-value'] }
]
},
'https://example.com'
);
console.log(result.status);<input data-validate data-message-box="message" name="username" type="text">
<p id="message"></p>
<script src="/dist/validare-web.js"></script>Sayfa yüklendiğinde input otomatik doğrulanır; kullanıcı yazarken veya alanı terk ettiğinde yeniden doğrulanır.
validare en doğru şekilde üç entegrasyon stiline sahip şema tabanlı bir doğrulama motoru olarak düşünülmelidir:
- uygulama kodu içinde doğrudan doğrulama
- Express middleware bileşimi
- uzaktan yüklenen şema dosyaları ile tarayıcı tarafı input doğrulama
Mimarisi kompakt ve okunabilirdir: şema çözümleme, kısa devre bayrakları, türe özel doğrulayıcı zincirleri ve isteğe bağlı mesaj çevirisi. Üretim kullanımında özellikle boş değer semantiği, sayısal kıyas isimlendirmesi ve tamamlanmamış dosya middleware'i gibi mevcut implementasyon ayrıntılarına tam olarak uymak gerekir.