-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
109 lines (107 loc) · 32.1 KB
/
index.html
File metadata and controls
109 lines (107 loc) · 32.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Robust Validator</title>
<meta name="description" content="Rule-based data validation library in JavaScript. It's extendable, function-oriented, and i18n supported.">
<meta name="generator" content="VitePress v1.6.3">
<link rel="preload stylesheet" href="/assets/style.BH_8qREQ.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.B_UN5ady.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.BSK7ghZt.js">
<link rel="modulepreload" href="/assets/chunks/framework.L8ryr_Zo.js">
<link rel="modulepreload" href="/assets/index.md.NQx8AkPC.lean.js">
<meta property="og:url" content="https://validator.axe-api.com">
<meta property="og:type" content="website">
<meta property="og:title" content="Robust Validator">
<meta property="og:description" content="Rule-based data validation library in JavaScript. It's extendable, function-oriented, and i18n supported.">
<meta property="og:image" content="https://validator.axe-api.com/og.png">
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="validator.axe-api.com">
<meta property="twitter:url" content="https://validator.axe-api.com">
<meta name="twitter:title" content="Robust Validator">
<meta name="twitter:description" content="Rule-based data validation library in JavaScript. It's extendable, function-oriented, and i18n supported.">
<meta name="twitter:image" content="https://validator.axe-api.com/og.png">
<link rel="stylesheet" href="/cookieconsent.css">
<script defer src="/init.js"></script>
<script type="text/plain" data-category="analytics" async data-src="https://www.googletagmanager.com/gtag/js?id=G-67G9G0VBCC"></script>
<script type="text/plain" data-category="analytics">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-67G9G0VBCC', { anonymize_ip: true });
</script>
<script id="check-dark-mode">document.documentElement.classList.add("dark");</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!----><span data-v-9f43907a>Robust Validator</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/blog.html" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Blog</span><!--]--></a><!--]--><!--]--></nav><!----><!----><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/axe-api/validator" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><!----><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/axe-api/validator" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><!----><!----><div class="VPContent is-home" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPHome" data-v-9a6c75ad data-v-e07eaea7><!--[--><!--]--><div class="VPHero has-image VPHomeHero" data-v-e07eaea7 data-v-dd8814ff><div class="container" data-v-dd8814ff><div class="main" data-v-dd8814ff><!--[--><!--]--><!--[--><h1 class="heading" data-v-dd8814ff><span class="name clip" data-v-dd8814ff>Robust Validator</span><span class="text" data-v-dd8814ff>Rule-based data validation in JS</span></h1><p class="tagline" data-v-dd8814ff>💡 Extendable. Function-oriented. i18n-ready.</p><!--]--><!--[--><!--]--><div class="actions" data-v-dd8814ff><!--[--><div class="action" data-v-dd8814ff><a class="VPButton medium brand" href="/getting-started.html" data-v-dd8814ff data-v-93dc4167>Get Started →</a></div><!--]--></div><!--[--><!--]--></div><div class="image" data-v-dd8814ff><div class="image-container" data-v-dd8814ff><div class="image-bg" data-v-dd8814ff></div><!--[--><!--[--><img class="VPImage image-src" src="/logo.png" alt="Robust Validator" data-v-ab19afbb><!--]--><!--]--></div></div></div></div><!--[--><!--]--><!--[--><!--]--><div class="VPFeatures VPHomeFeatures" data-v-e07eaea7 data-v-b1eea84a><div class="container" data-v-b1eea84a><div class="items" data-v-b1eea84a><!--[--><div class="grid-4 item" data-v-b1eea84a><div class="VPLink no-icon VPFeature" data-v-b1eea84a data-v-bd37d1a2><!--[--><article class="box" data-v-bd37d1a2><!----><h2 class="title" data-v-bd37d1a2>Declarative ✍🏽</h2><p class="details" data-v-bd37d1a2>Write rules once, reuse anywhere: configs, DB, UI, etc.</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-b1eea84a><div class="VPLink no-icon VPFeature" data-v-b1eea84a data-v-bd37d1a2><!--[--><article class="box" data-v-bd37d1a2><!----><h2 class="title" data-v-bd37d1a2>Simple 🐤</h2><p class="details" data-v-bd37d1a2>Validate anything in seconds. It's designed to be fast and intuitive.</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-b1eea84a><div class="VPLink no-icon VPFeature" data-v-b1eea84a data-v-bd37d1a2><!--[--><article class="box" data-v-bd37d1a2><!----><h2 class="title" data-v-bd37d1a2>Proof of Work 💪</h2><p class="details" data-v-bd37d1a2>Inspired by Laravel. Refined for JavaScript. Production-tested.</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-b1eea84a><div class="VPLink no-icon VPFeature" data-v-b1eea84a data-v-bd37d1a2><!--[--><article class="box" data-v-bd37d1a2><!----><h2 class="title" data-v-bd37d1a2>i18n 🇺🇳</h2><p class="details" data-v-bd37d1a2>Full multi-language support built-in. No need for extra setup.</p><!----></article><!--]--></div></div><!--]--></div></div></div><!--[--><!--]--><div class="vp-doc container" style="" data-v-e07eaea7 data-v-c141a4bd><!--[--><div style="position:relative;" data-v-e07eaea7><div><section class="used-by"><div class="used-by-title">Projects using Robust Validator</div><div class="used-by-logos"><a href="https://axe-api.com" target="_blank" rel="noopener" class="used-by-item" title="Axe API"><img src="https://axe-api.com/viking.png" alt="Axe API"><div class="used-by-name">Axe API</div></a><a href="https://github.com/axe-api/validator/edit/main/docs/index.md" target="_blank" rel="noopener" class="used-by-item used-by-add" title="Add your project"><div class="add-logo">+</div><div class="used-by-name">Add your project</div></a></div></section><div class="demo-section"><div class="demo-text"><h3>Validate your data in a declarative way</h3><p> The <code>validate()</code> function checks your data against rule definitions using simple, readable syntax like <code>"required|email"</code>. </p><p> It works directly with plain JavaScript objects, so you stay in control of when and how validation is performed. </p><p> The library is function oriented, extendable, and built to fit cleanly into any part of your application logic. </p></div><div class="demo-code"><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { validate } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "robust-validator"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> rules</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> email: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"required|email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> age: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"integer|min:18"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> email: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"test@example.com"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> age: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">21</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> validate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data, rules);</span></span></code></pre></div></div></div><div class="demo-section"><div class="demo-code"><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> email: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"not-a-valid-email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> definition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> email: [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">required</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">email</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">255</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> name: [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">required</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> validate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data, definition);</span></span></code></pre></div></div><div class="demo-text"><h3>Use composable functions for rule definitions</h3><p> Instead of writing rules as strings, you can define them as function calls. This gives you full control, better type safety, and cleaner auto-completion in editors. </p><p> Every rule becomes a reusable function, making your validation logic easier to test and extend when your app grows. </p></div></div><div class="demo-section"><div class="demo-text"><h3>Structured output for clean error handling</h3><p> The result from the <code>validate()</code> function includes everything you need to respond or react. It separates global state from field-level results. </p><p> You get <code>isValid</code>, <code>isInvalid</code>, per-field status, and a detailed list of errors with rule names and messages. </p></div><div class="demo-code"><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "isValid"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "isInvalid"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "fields"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "surname"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "errors"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "rule"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"required"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> "message"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"The field is required."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></div></div><div class="demo-section"><div class="demo-code"><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> users: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> addresses: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { city: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"Copenhagen"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> definition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "users.addresses.*.city"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"required"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> validate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(data, definition);</span></span></code></pre></div></div><div class="demo-text"><h3>Validate deeply nested data with dot notation</h3><p> The validator supports nested objects and arrays out of the box. You can use dot notation to target any depth in the data structure. </p><p> Wildcards like <code>*</code> make it easy to validate each item in an array without writing repetitive rules. </p><p> This syntax works seamlessly for complex payloads, including user profiles, form builders, or nested APIs, without requiring any extra setup. </p></div></div><div class="demo-section"><div class="demo-text"><h3>Built-in support for multiple languages</h3><p> Robust Validator includes native i18n support. You can register multiple locales and switch the language with a single option. </p><p> This makes it easy to return localized error messages for forms, APIs, or any user-facing validation without extra libraries. </p></div><div class="demo-code"><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { setLocales, setOptions, en, fr, de } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "robust-validator"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Setting the supported locales</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">setLocales</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(en, fr, de);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Setting the user's locale</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">setOptions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({ language: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"en"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> });</span></span></code></pre></div></div></div><div class="demo-section"><div class="demo-code"><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { register } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "robust-validator"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ruleFunction</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // TODO: add your custom rule logic here</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">register</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"exists"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, ruleFunction, {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> en: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"The record doesn't exists on database: {0}"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div></div><div class="demo-text"><h3>Create your own validation rules</h3><p> Robust Validator lets you register custom rules using the <code>register()</code> function. This is ideal when you need to add application-specific logic, like checking if a record exists in the database. </p><p> You define the rule name, a validation function, and localized error messages. Once registered, your custom rule behaves just like any built-in rule. </p></div></div><div class="l-title">Supported Languages</div><p class="l-description"> Robust Validator includes built-in error messages for a wide range of languages. You can use them as-is or extend them with your own translations. </p><div class="l-table"><div class="l-cell">Arabic</div><div class="l-cell">Azerbaijani</div><div class="l-cell">Belarusian</div><div class="l-cell">Bulgarian</div><div class="l-cell">Bosnian</div><div class="l-cell">Catalan</div><div class="l-cell">Czech</div><div class="l-cell">Welsh</div><div class="l-cell">Danish</div><div class="l-cell">German</div><div class="l-cell">Greek</div><div class="l-cell">English</div><div class="l-cell">Spanish</div><div class="l-cell">Estonian</div><div class="l-cell">Basque</div><div class="l-cell">Persian</div><div class="l-cell">Finnish</div><div class="l-cell">French</div><div class="l-cell">Croatian</div><div class="l-cell">Hungarian</div><div class="l-cell">Indonesian</div><div class="l-cell">Italian</div><div class="l-cell">Japanese</div><div class="l-cell">Georgian</div><div class="l-cell">Korean</div><div class="l-cell">Limburgish</div><div class="l-cell">Lithuanian</div><div class="l-cell">Latvian</div><div class="l-cell">Macedonian</div><div class="l-cell">Mongolian</div><div class="l-cell">Malay</div><div class="l-cell">Norwegian</div><div class="l-cell">Dutch</div><div class="l-cell">Polish</div><div class="l-cell">Portuguese</div><div class="l-cell">Romanian</div><div class="l-cell">Russian</div><div class="l-cell">Northern Sami</div><div class="l-cell">Slovenian</div><div class="l-cell">Albanian</div><div class="l-cell">Serbian</div><div class="l-cell">Swedish</div><div class="l-cell">Turkish</div><div class="l-cell">Ukrainian</div><div class="l-cell">Vietnamese</div><div class="l-cell">Chinese</div></div></div></div><!--]--></div></div></div><footer class="VPFooter" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>Released under the MIT License. | <a href="/privacy-policy">Privacy Policy</a> | <a href="/cookie-policy">Cookie Policy</a> | <a style="cursor: pointer" data-cc="show-preferencesModal">Cookie preferences</a></p><p class="copyright" data-v-566314d4>Copyright © 2020-present</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"404.md\":\"DXxhBDBs\",\"blog.md\":\"DhId_h05\",\"blog_2025-07-12-how-to-validate-nested-objects-in-javascript-with-robust-validator.md\":\"_hWaR41G\",\"blog_2025-07-13-how-to-build-a-custom-validation-rule-in-javascript-with-robust-validator.md\":\"CcTRJLoF\",\"blog_2025-07-13-whats-new-in-robust-validator-v3.md\":\"CjbcIq-F\",\"blog_2025-07-14-how-to-validate-multilingual-error-messages-in-javascript-using-robust-validator.md\":\"ChuIfkty\",\"cookie-policy.md\":\"DVgnghAX\",\"customization.md\":\"28DLxhYF\",\"examples.md\":\"DG-YPkQu\",\"getting-started.md\":\"D6bv1dsQ\",\"i18n.md\":\"DxuMvIQv\",\"index.md\":\"NQx8AkPC\",\"options.md\":\"DkPgGocf\",\"privacy-policy.md\":\"GrYWhnjj\",\"purpose.md\":\"E9ECP0aw\",\"rules.md\":\"BT0ogGfs\",\"terminology.md\":\"BBC4oM9o\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Robust Validator\",\"description\":\"Rule-based data validation library in JavaScript. It's extendable, function-oriented, and i18n supported.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"force-dark\",\"themeConfig\":{\"nav\":[{\"text\":\"Blog\",\"link\":\"/blog\"}],\"editLink\":{\"pattern\":\"https://github.com/axe-api/validator/edit/main/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"sidebar\":[{\"text\":\"Introduction\",\"items\":[{\"text\":\"Purpose\",\"link\":\"/purpose\"},{\"text\":\"Getting started\",\"link\":\"/getting-started\"},{\"text\":\"Examples\",\"link\":\"/examples\"},{\"text\":\"Terminology\",\"link\":\"/terminology\"}]},{\"text\":\"Reference\",\"items\":[{\"text\":\"Rules\",\"link\":\"/rules\"},{\"text\":\"i18n\",\"link\":\"/i18n\"},{\"text\":\"Customization\",\"link\":\"/customization\"},{\"text\":\"Options\",\"link\":\"/options\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/axe-api/validator\"}],\"footer\":{\"message\":\"Released under the MIT License. | <a href=\\\"/privacy-policy\\\">Privacy Policy</a> | <a href=\\\"/cookie-policy\\\">Cookie Policy</a> | <a style=\\\"cursor: pointer\\\" data-cc=\\\"show-preferencesModal\\\">Cookie preferences</a>\",\"copyright\":\"Copyright © 2020-present\"},\"search\":{\"provider\":\"local\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
</body>
</html>