From 2c93a18714a3ded5a947fdea7b47599cabb794ca Mon Sep 17 00:00:00 2001 From: GitHub workflow <2769109+epoberezkin@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:31:33 +0000 Subject: [PATCH] updated by ajv workflow https://github.com/ajv-validator/ajv/actions/runs/8022137892 --- 404.html | 8 +-- api.html | 6 +- assets/css/0.styles.a67213ca.css | 1 + assets/img/contributors.03a47a6b.jpg | Bin 0 -> 235100 bytes assets/js/21.850ead6f.js | 1 + assets/js/47.16fe56db.js | 1 + assets/js/48.688ea8b6.js | 1 + assets/js/52.021ab645.js | 1 + assets/js/53.6a790be8.js | 1 + assets/js/57.4c47bf28.js | 1 + assets/js/59.8be7d720.js | 1 + assets/js/60.e6687b92.js | 1 + assets/js/63.ce51185c.js | 1 + assets/js/64.13ccbf28.js | 1 + assets/js/65.7103f360.js | 1 + assets/js/67.ca98640c.js | 1 + assets/js/72.5466396d.js | 1 + assets/js/77.bd290d20.js | 1 + assets/js/78.54ff67c4.js | 1 + assets/js/79.f3b15312.js | 1 + assets/js/81.b73b1070.js | 1 + assets/js/app.7f6e3378.js | 16 +++++ code_of_conduct/index.html | 6 +- codegen.html | 6 +- coercion.html | 6 +- components.html | 6 +- contributing/index.html | 6 +- faq.html | 6 +- guide/async-validation.html | 6 +- guide/combining-schemas.html | 6 +- guide/environments.html | 6 +- guide/formats.html | 6 +- guide/getting-started.html | 6 +- guide/managing-schemas.html | 6 +- guide/modifying-data.html | 6 +- guide/schema-language.html | 6 +- guide/typescript.html | 6 +- guide/user-keywords.html | 6 +- guide/why-ajv.html | 6 +- index.html | 58 +++++++++--------- json-schema.html | 6 +- json-type-definition.html | 6 +- keywords.html | 6 +- license.html | 6 +- ...08-14-mozilla-grant-openjs-foundation.html | 6 +- news/2020-12-15-ajv-version-7-released.html | 6 +- ...-07-ajv-supports-json-type-definition.html | 6 +- news/2021-03-27-ajv-version-8-released.html | 6 +- news/2021-04-24-ajv-online-event.html | 6 +- news/2021-05-24-ajv-online-event-video.html | 6 +- ...1-07-22-ajv-microsoft-foss-fund-award.html | 6 +- news/index.html | 6 +- options.html | 6 +- packages/ajv-cli.html | 6 +- packages/ajv-errors.html | 6 +- packages/ajv-formats.html | 6 +- packages/ajv-i18n.html | 6 +- packages/ajv-keywords.html | 6 +- packages/index.html | 6 +- security.html | 6 +- standalone.html | 6 +- strict-mode.html | 6 +- testimonials.html | 6 +- v6-to-v8-migration.html | 6 +- 64 files changed, 193 insertions(+), 159 deletions(-) create mode 100644 assets/css/0.styles.a67213ca.css create mode 100644 assets/img/contributors.03a47a6b.jpg create mode 100644 assets/js/21.850ead6f.js create mode 100644 assets/js/47.16fe56db.js create mode 100644 assets/js/48.688ea8b6.js create mode 100644 assets/js/52.021ab645.js create mode 100644 assets/js/53.6a790be8.js create mode 100644 assets/js/57.4c47bf28.js create mode 100644 assets/js/59.8be7d720.js create mode 100644 assets/js/60.e6687b92.js create mode 100644 assets/js/63.ce51185c.js create mode 100644 assets/js/64.13ccbf28.js create mode 100644 assets/js/65.7103f360.js create mode 100644 assets/js/67.ca98640c.js create mode 100644 assets/js/72.5466396d.js create mode 100644 assets/js/77.bd290d20.js create mode 100644 assets/js/78.54ff67c4.js create mode 100644 assets/js/79.f3b15312.js create mode 100644 assets/js/81.b73b1070.js create mode 100644 assets/js/app.7f6e3378.js diff --git a/404.html b/404.html index 9c1014948..5e3fd8a03 100644 --- a/404.html +++ b/404.html @@ -18,13 +18,13 @@ - - + + -

404

How did we get here?
+ - + diff --git a/api.html b/api.html index 8d652090e..08be93853 100644 --- a/api.html +++ b/api.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/assets/css/0.styles.a67213ca.css b/assets/css/0.styles.a67213ca.css new file mode 100644 index 000000000..819216f1e --- /dev/null +++ b/assets/css/0.styles.a67213ca.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#545252;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#07aab4}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#292828}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#292828}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:480px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#292828}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#07aab4}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:480px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}img+span>.icon.outbound{display:none}body{font-family:Raleway;font-weight:400}strong{font-weight:550}h1,h2,h3,h4,h5,h6{font-family:IstokWeb;font-weight:400}.custom-block.tip{border-color:#23c8d2;background-color:#f7f7f3;color:#292828}.custom-block.tip .custom-block-title{color:#292828}.custom-block.warning{border-color:#f1f440;background-color:#f7f7f3;color:#292828}.custom-block.warning .custom-block-title{color:#292828}.custom-block.danger{border-color:#f5775b;background-color:#f7f7f3;color:#292828}.custom-block.danger .custom-block-title{color:#292828}.sidebar nav.nav-links div.nav-item{display:none}span.badge{font-family:Raleway;font-weight:500}.theme-code-group .token.string{color:#7ec699}.theme-code-group button.theme-code-group__nav-tab.theme-code-group__nav-tab-active{border-color:#7ec699}.navbar span.site-name{font-family:IstokWeb;font-weight:500;font-size:1.6em}p.sidebar-heading{font-weight:500;font-size:1em}a.sidebar-link.active{font-weight:500!important}@font-face{font-family:Raleway;src:url(/fonts/Raleway-VariableFont_wght.ttf)}@font-face{font-family:IstokWeb;src:url(/fonts/IstokWeb-Regular.ttf);font-weight:400}#nprogress{pointer-events:none}#nprogress .bar{background:#07aab4;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #07aab4,0 0 5px #07aab4;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#07aab4 transparent transparent #07aab4;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#07aab4;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#292828}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#292828}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#807d7d}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#07aab4;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #0699a2}.home .hero .action-button:hover{background-color:#08c7d3}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3f3d3d}.home .feature p{color:#5f5d5d}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#5f5d5d}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:480px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#5f5d5d;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#07aab4}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#757272}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#07aab4}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:480px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-6eb0829b]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;background-color:#42b983}.badge.green[data-v-6eb0829b],.badge.tip[data-v-6eb0829b]{background-color:#23c8d2}.badge.error[data-v-6eb0829b]{background-color:#f5775b}.badge.warn[data-v-6eb0829b],.badge.warning[data-v-6eb0829b],.badge.yellow[data-v-6eb0829b]{background-color:#e9c400}.badge+.badge[data-v-6eb0829b]{margin-left:5px}.theme-code-block[data-v-311ec9b4]{display:none}.theme-code-block__active[data-v-311ec9b4]{display:block}.theme-code-block>pre[data-v-311ec9b4]{background-color:orange}.theme-code-group__nav[data-v-5cad0a2e]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-5cad0a2e]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-5cad0a2e]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-5cad0a2e]{border-bottom:1px solid #42b983}.pre-blank[data-v-5cad0a2e]{color:#42b983}a.button[data-v-439d4a3b]{display:block;width:114px;height:38px;line-height:38px;background-color:#23c8d2;border-radius:6px;color:#fff;text-align:center;font-weight:600}.column[data-v-71066fea]{margin-bottom:22px}@media only screen and (min-width:719px){.column.left[data-v-71066fea]{width:33%;margin-right:5%}.column.right[data-v-71066fea]{width:62%}}@media only screen and (min-width:719px){.columns[data-v-6d930324]{display:flex}}.contributor[data-v-074475b8]{width:3.26em;height:3.26em;border-radius:50%;text-indent:-9999px;display:inline-block;background:no-repeat url(/assets/img/contributors.03a47a6b.jpg);background-size:auto 102%;margin:0 .67em .67em 0;border:2px solid var(--second)}@media only screen and (min-width:414px){.contributor[data-v-074475b8]{width:3.625em;height:3.625em;margin:0 .8em .8em 0}}div[data-v-20681dd8]{height:200px;box-sizing:border-box;padding:28px;border-radius:8px;position:relative;color:#fff;margin-bottom:25px}@media only screen and (min-width:480px){div[data-v-20681dd8]{height:160px}}@media only screen and (min-width:719px){div[data-v-20681dd8]{width:31.25%;height:225px;margin-right:3%;margin-bottom:0}}div h3[data-v-20681dd8]{margin:0}@media only screen and (min-width:959px){div h3[data-v-20681dd8]{font-size:1.75em}}div h3 .header-anchor[data-v-20681dd8]{display:none}@media only screen and (min-width:959px){div p[data-v-20681dd8]{font-size:1.25em}}div.less-code[data-v-20681dd8]{background-color:#23c8d2}div.fast-secure[data-v-20681dd8]{background-color:#409cff}div.multi-spec[data-v-20681dd8]{background-color:#f5775b}@media only screen and (min-width:719px){div[data-v-20681dd8]:last-child{margin-right:0}}a[data-v-20681dd8]{position:absolute;bottom:24px;right:24px;color:#fff}.features[data-v-30c230c6]{padding:60px 0}@media only screen and (min-width:719px){.features[data-v-30c230c6]{display:flex}}@media only screen and (min-width:719px){div[data-v-f7c18a96]{width:25%}}p a[data-v-f7c18a96]{color:#292828;font-weight:400}p a[data-v-f7c18a96]:hover{text-decoration:underline}@media only screen and (max-width:719px){p[data-v-f7c18a96]{margin:0;line-height:30px}}.column img[data-v-f7c18a96]{display:block;margin:0 auto}.column.ajv img[data-v-f7c18a96]{margin:0;width:100px}@media only screen and (max-width:719px){.column.ajv img[data-v-f7c18a96]{margin-bottom:34px}}.column.links a[data-v-f7c18a96]{color:#292828;font-weight:400}@media only screen and (max-width:719px){.column.sponsors a[data-v-f7c18a96]:first-child{display:block;margin-top:80px}}.column.sponsors img[data-v-f7c18a96]{width:140px;padding:0 20px 15px}.footer-columns[data-v-de1d7950]{padding:20px 0 60px;border-bottom:1px solid #c4c4c4}@media only screen and (min-width:719px){.footer-columns[data-v-de1d7950]{display:flex}}span[data-v-3ac601d9]{vertical-align:-8px;padding-left:20px}@media only screen and (max-width:719px){span[data-v-3ac601d9]{vertical-align:-21px}}.hero-section[data-v-37c67372]{width:100%;padding:3.6rem 0 50px;overflow:hidden;background:linear-gradient(304.33deg,hsla(0,0%,92.9%,.31) -7.48%,#c6e1ff 30.07%,hsla(0,0%,92.9%,.26) 82.76%)}.hero-section .section-content[data-v-37c67372]{position:relative;max-width:1000px;padding:0 50px;margin:0 auto}@media only screen and (max-width:719px){.hero-section .section-content[data-v-37c67372]{padding:0 40px}}@media only screen and (max-width:480px){.hero-section .section-content[data-v-37c67372]{padding:0 30px}}.hero-section .section-content .section-content-wrapper[data-v-37c67372]{position:relative;z-index:2}.hero-section .hero-image[data-v-37c67372]{position:absolute;z-index:1;width:658px;top:-400px;left:-25px}@media only screen and (min-width:480px){.hero-section .hero-image[data-v-37c67372]{width:823px;top:-500px;left:50px}}@media only screen and (min-width:719px){.hero-section .hero-image[data-v-37c67372]{top:-430px;left:330px}}@media only screen and (min-width:959px){.hero-section .hero-image[data-v-37c67372]{width:1097px;top:-575px;left:425px}}.hero-section .header-anchor[data-v-37c67372]{display:none}.hero-section h1[data-v-37c67372]{font-size:2em;margin-top:200px}.hero-section h2[data-v-37c67372]{border-bottom:none}@media only screen and (min-width:480px){.hero-section h1[data-v-37c67372]{font-size:3em}.hero-section h2[data-v-37c67372]{font-size:1.75em}}@media only screen and (min-width:719px){.hero-section h1[data-v-37c67372],.hero-section h2[data-v-37c67372]{margin-left:48px}}@media only screen and (min-width:959px){.hero-section h1[data-v-37c67372]{font-size:4em}.hero-section h2[data-v-37c67372]{font-size:2.25em}.hero-section h1[data-v-37c67372],.hero-section h2[data-v-37c67372]{margin-left:64px}}.homepage[data-v-07ee638e]{padding:0;box-sizing:content-box}.home-section[data-v-aed41194]{width:100%;padding:3.6rem 0 50px}.home-section .section-content[data-v-aed41194]{max-width:1000px;padding:0 50px;margin:0 auto}@media only screen and (max-width:719px){.home-section .section-content[data-v-aed41194]{padding:0 40px}}@media only screen and (max-width:480px){.home-section .section-content[data-v-aed41194]{padding:0 30px}}.home-section[data-v-aed41194] .theme-code-group button{position:relative;outline:none;z-index:1}.home-section.contributors[data-v-aed41194],.home-section.footer[data-v-aed41194],.home-section.testimonials[data-v-aed41194]{background:linear-gradient(295.26deg,hsla(0,0%,91%,.8) 26.65%,hsla(0,0%,100%,.04) 83.48%)}.home-section.footer p[data-v-aed41194]{padding:20px 0 0;text-align:center;color:#292828}.home-section.footer p a[data-v-aed41194]{color:#292828;font-weight:400}.home-section.footer p a[data-v-aed41194]:hover{text-decoration:underline}.post[data-v-a228e400]{display:flex;border-bottom:1px solid #eaecef}.post[data-v-a228e400]:last-child{border-bottom:none}.post a.read-more[data-v-a228e400]{float:right;margin:28px 0}p.subscribe[data-v-a228e400]{margin-top:2em}p.subscribe a.all-news[data-v-a228e400]{display:block;margin-top:1rem}@media only screen and (min-width:480px){p.subscribe a.all-news[data-v-a228e400]{display:inline-block;float:right;margin-top:0}}.post-meta>div[data-v-f7ce3066]{display:inline-flex}.pub-date[data-v-f7ce3066]{color:grey}.projects p[data-v-7ef3dfe8]{max-width:1100px;padding:0}.projects img[data-v-7ef3dfe8]{display:inline-block;max-width:240px;height:40px;line-height:40px;vertical-align:middle}@media only screen and (max-width:719px){.projects img[data-v-7ef3dfe8]{max-width:160px;height:30px;line-height:30px}}.projects a[data-v-7ef3dfe8]{display:inline-block;height:40px;line-height:40px;vertical-align:middle;margin:0 36px 30px 0;font-size:28px;font-weight:500;color:#292828}@media only screen and (max-width:719px){.projects a[data-v-7ef3dfe8]{margin:0 24px 20px 0;height:30px;line-height:30px;font-size:20px}}.projects a[data-v-7ef3dfe8]:hover{text-decoration:none}.projects a span[data-v-7ef3dfe8]{display:none}.sponsors[data-v-c1b00a8c]{max-width:800px;margin:0 auto}.sponsors h2[data-v-c1b00a8c]{margin-left:0;text-decoration:none}.sponsors h2 a.header-anchor[data-v-c1b00a8c]{width:auto;margin-right:0}.sponsors p[data-v-c1b00a8c]{font-size:24px}.sponsors.bronze img[data-v-c1b00a8c],.sponsors.gold img[data-v-c1b00a8c],.sponsors.platinum img[data-v-c1b00a8c]{width:100%}.sponsors.bronze a[data-v-c1b00a8c],.sponsors.gold a[data-v-c1b00a8c],.sponsors.platinum a[data-v-c1b00a8c]{margin-bottom:10px;display:inline-block}@media only screen and (min-width:480px){.sponsors.bronze a[data-v-c1b00a8c],.sponsors.gold a[data-v-c1b00a8c],.sponsors.platinum a[data-v-c1b00a8c]{margin-bottom:0}}.sponsors.bronze a[data-v-c1b00a8c]:last-child,.sponsors.gold a[data-v-c1b00a8c]:last-child,.sponsors.platinum a[data-v-c1b00a8c]:last-child{margin-right:0}.sponsors.platinum a[data-v-c1b00a8c]{width:100%;display:block}@media only screen and (min-width:480px){.sponsors.platinum a[data-v-c1b00a8c]{display:inline-block;width:45%;margin-right:8%}}.sponsors.gold a[data-v-c1b00a8c]{width:45%;margin-right:4%}@media only screen and (min-width:480px){.sponsors.gold a[data-v-c1b00a8c]{width:31%;margin-right:2%}}.sponsors.bronze a[data-v-c1b00a8c]{width:45%;margin-right:4%}@media only screen and (min-width:480px){.sponsors.bronze a[data-v-c1b00a8c]{width:22%;margin-right:3%}}form[data-v-410e8fc2]{display:inline-block}label[data-v-410e8fc2]{display:block;margin-bottom:1rem}@media only screen and (min-width:719px){label[data-v-410e8fc2]{display:inline-block;margin-bottom:0}}button[data-v-410e8fc2],input[data-v-410e8fc2]{font-family:Raleway;font-size:16px;border:0 solid;outline:none}input[data-v-410e8fc2]{border:1px solid #cfd4db;height:2rem;width:180px;border-radius:2rem;padding:0 .5rem;margin:0 .5rem 0 0}input[data-v-410e8fc2]:focus{border-color:#07aab4}@media only screen and (min-width:719px){input[data-v-410e8fc2]{width:200px;margin:0 1rem}}button[data-v-410e8fc2]{width:114px;height:36px;line-height:36px;padding-top:0;background-color:#23c8d2;border-radius:6px;color:#fff;text-align:center;font-weight:600;display:block;margin-top:1em}@media only screen and (min-width:414px){button[data-v-410e8fc2]{display:inline-block;margin-top:0}}div.testimonial-content[data-v-2c05e654]{background-position:50%;overflow:hidden;width:280px;background-repeat:no-repeat}div.testimonial-content.blue[data-v-2c05e654]{background-image:url(/assets/img/testimonials-blue.868231a8.svg)}div.testimonial-content.green[data-v-2c05e654]{background-image:url(/assets/img/testimonials-green.6fdaa89c.svg)}div.testimonial-content p[data-v-2c05e654]{margin:.9em 0;font-size:15px}@media only screen and (max-width:374px){div.testimonial-content.blue[data-v-2c05e654],div.testimonial-content.green[data-v-2c05e654]{background-image:none;padding:0}div.testimonial-content.blue p[data-v-2c05e654],div.testimonial-content.green p[data-v-2c05e654]{font-size:15px}}@media only screen and (max-width:500px){div.testimonial-content[data-v-2c05e654]{width:100%;background-size:350px 156px;padding:0 calc(50% - 100px);box-sizing:border-box}div.testimonial-content p[data-v-2c05e654]{font-size:12px}}@media only screen and (min-width:500px){div.testimonial-content[data-v-2c05e654]{height:212px;padding:0 75px;margin:40px auto 0}}@media only screen and (min-width:959px){div.testimonial-content[data-v-2c05e654]{padding:0 calc(25% - 140px)}}.header-anchor[data-v-2c05e654]{display:none}.testimonials[data-v-729b0721]{padding:20px 0}@media only screen and (min-width:959px){.testimonials[data-v-729b0721]{display:flex}}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#292828}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#07aab4}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#07aab4}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #07aab4;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#07aab4}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#292828}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #08c1cd}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#292828;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:480px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#5f5d5d;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#5f5d5d}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:480px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page,.page[data-v-22624a70]{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#292828;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#07aab4;border-left-color:#07aab4}.sidebar-heading.clickable:hover{color:#07aab4}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#292828;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#07aab4}a.sidebar-link.active{font-weight:600;color:#07aab4;border-left-color:#07aab4}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}} \ No newline at end of file diff --git a/assets/img/contributors.03a47a6b.jpg b/assets/img/contributors.03a47a6b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd917c1c25a5d4769c5869512935ddbe33739e4e GIT binary patch literal 235100 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 z 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 zf$Cr6raCix&1FZT({contributors:o.a})},t=(n(348),n(14)),s=Object(t.a)(i,(function(){var a=this,e=a._self._c;return e("div",a._l(a.contributors,(function(n,r){return e("a",{staticClass:"contributor",style:"background-position: "+100*r/(a.contributors.length-1)+"% 0",attrs:{href:"https://github.com/"+n}},[a._v("\n "+a._s(n)+"\n ")])})),0)}),[],!1,null,"074475b8",null);e.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/47.16fe56db.js b/assets/js/47.16fe56db.js new file mode 100644 index 000000000..5237787d8 --- /dev/null +++ b/assets/js/47.16fe56db.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{396:function(e,t,o){"use strict";o.r(t);var a=o(14),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"type-coercion-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#type-coercion-rules"}},[e._v("#")]),e._v(" Type coercion rules")]),e._v(" "),t("p",[e._v("To enable type coercion pass option "),t("code",[e._v("coerceTypes")]),e._v(" to Ajv with "),t("code",[e._v("true")]),e._v(" or "),t("code",[e._v("array")]),e._v(" (it is "),t("code",[e._v("false")]),e._v(" by default). See "),t("RouterLink",{attrs:{to:"/guide/modifying-data.html#coercing-data-types"}},[e._v("example")]),e._v(".")],1),e._v(" "),t("p",[e._v("The coercion rules are different from JavaScript:")]),e._v(" "),t("ul",[t("li",[e._v("to validate user input as expected")]),e._v(" "),t("li",[e._v("to have the coercion reversible")]),e._v(" "),t("li",[e._v("to correctly validate cases where different types are required in subschemas (e.g., in "),t("code",[e._v("anyOf")]),e._v(").")])]),e._v(" "),t("p",[e._v("Type coercion only happens if there is "),t("code",[e._v("type")]),e._v(" keyword and if without coercion the validation would have failed. If coercion to the required type succeeds then the validation continues to other keywords, otherwise the validation fails.")]),e._v(" "),t("p",[e._v("If there are multiple types allowed in "),t("code",[e._v("type")]),e._v(" keyword the coercion will only happen if none of the types match the data and some of the scalar types are present (coercion to/from "),t("code",[e._v("object")]),e._v("/"),t("code",[e._v("array")]),e._v(" is not possible). In this case the validating function will try coercing the data to each type in order until some of them succeeds.")]),e._v(" "),t("p",[e._v("Application of these rules can have some unexpected consequences. Ajv may coerce the same value multiple times (this is why coercion reversibility is required) as needed at different points in the schema. This is particularly evident when using "),t("code",[e._v("oneOf")]),e._v(", which must test all of the subschemas. Ajv will coerce the type for each subschema, possibly resulting in unexpected failure if it can coerce to match more than one of the subschemas. Even if it succeeds, Ajv will not backtrack, so you'll get the type of the final coercion even if that's not the one that allowed the data to pass validation. If possible, structure your schema with "),t("code",[e._v("anyOf")]),e._v(", which won't validate subsequent subschemas as soon as it encounters one subschema that matches.")]),e._v(" "),t("p",[e._v("Possible type coercions:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("from type →"),t("br"),e._v("to type ↓")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("string")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("number")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("boolean")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("null")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("array*")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("string")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v('""+x')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v('"false"')]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v('"true"')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v('""')])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[x]")]),e._v("→"),t("code",[e._v("x")])])]),e._v(" "),t("tr",[t("td",[e._v("number /"),t("br"),e._v("integer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("Valid number /"),t("br"),e._v("integer: "),t("code",[e._v("x")]),e._v("→"),t("code",[e._v("+x")]),t("br")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("0")]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v("1")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("0")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[x]")]),e._v("→"),t("code",[e._v("x")])])]),e._v(" "),t("tr",[t("td",[e._v("boolean")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v('"false"')]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v('"true"')]),e._v("→"),t("code",[e._v("true")]),t("br"),t("code",[e._v('"abc"')]),e._v("⇸"),t("br"),t("code",[e._v('""')]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("0")]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v("1")]),e._v("→"),t("code",[e._v("true")]),t("br"),t("code",[e._v("x")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("false")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[false]")]),e._v("→"),t("code",[e._v("false")]),t("br"),t("code",[e._v("[true]")]),e._v("→"),t("code",[e._v("true")])])]),e._v(" "),t("tr",[t("td",[e._v("null")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v('""')]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v('"null"')]),e._v("⇸"),t("br"),t("code",[e._v('"abc"')]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("0")]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v("x")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("null")]),t("br"),t("code",[e._v("true")]),e._v("⇸")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("[null]")]),e._v("→"),t("code",[e._v("null")])])]),e._v(" "),t("tr",[t("td",[e._v("array*")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v("[x]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("x")]),e._v("→"),t("code",[e._v("[x]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("false")]),e._v("→"),t("code",[e._v("[false]")]),t("br"),t("code",[e._v("true")]),e._v("→"),t("code",[e._v("[true]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("code",[e._v("null")]),e._v("→"),t("code",[e._v("[null]")])]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("-")])])])]),e._v(" "),t("p",[e._v("* Requires option "),t("code",[e._v('{coerceTypes: "array"}')])]),e._v(" "),t("h2",{attrs:{id:"coercion-from-string-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-string-values"}},[e._v("#")]),e._v(" Coercion from string values")]),e._v(" "),t("h4",{attrs:{id:"to-number-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-type"}},[e._v("#")]),e._v(" To number type")]),e._v(" "),t("p",[e._v("Coercion to "),t("code",[e._v("number")]),e._v(" is possible if the string is a valid number, "),t("code",[e._v("+data")]),e._v(" is used.")]),e._v(" "),t("h4",{attrs:{id:"to-integer-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-integer-type"}},[e._v("#")]),e._v(" To integer type")]),e._v(" "),t("p",[e._v("Coercion to "),t("code",[e._v("integer")]),e._v(" is possible if the string is a valid number without fractional part ("),t("code",[e._v("data % 1 === 0")]),e._v(").")]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[e._v("Unlike JavaScript, only these strings can be coerced to "),t("code",[e._v("boolean")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("code",[e._v('"true"')]),e._v(" -> "),t("code",[e._v("true")])]),e._v(" "),t("li",[t("code",[e._v('"false"')]),e._v(" -> "),t("code",[e._v("false")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[e._v("Empty string is coerced to "),t("code",[e._v("null")]),e._v(", other strings can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-number-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-number-values"}},[e._v("#")]),e._v(" Coercion from number values")]),e._v(" "),t("h4",{attrs:{id:"to-string-type"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("p",[e._v("Always possible, "),t("code",[e._v("'' + data")]),e._v(" is used")]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type-2"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[e._v("Unlike JavaScript, only these numbers can be coerced to "),t("code",[e._v("boolean")]),e._v(":")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("1")]),e._v(" -> "),t("code",[e._v("true")])]),e._v(" "),t("li",[t("code",[e._v("0")]),e._v(" -> "),t("code",[e._v("false")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type-2"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[t("code",[e._v("0")]),e._v(" coerces to "),t("code",[e._v("null")]),e._v(", other numbers can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-boolean-values"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-boolean-values"}},[e._v("#")]),e._v(" Coercion from boolean values")]),e._v(" "),t("h4",{attrs:{id:"to-string-type-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type-2"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("true")]),e._v(" -> "),t("code",[e._v('"true"')])]),e._v(" "),t("li",[t("code",[e._v("false")]),e._v(" -> "),t("code",[e._v('"false"')])])]),e._v(" "),t("h4",{attrs:{id:"to-number-integer-types"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-integer-types"}},[e._v("#")]),e._v(" To number/integer types")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("true")]),e._v(" -> "),t("code",[e._v("1")])]),e._v(" "),t("li",[t("code",[e._v("false")]),e._v(" -> "),t("code",[e._v("0")])])]),e._v(" "),t("h4",{attrs:{id:"to-null-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-null-type-3"}},[e._v("#")]),e._v(" To null type")]),e._v(" "),t("p",[t("code",[e._v("false")]),e._v(" coerces to "),t("code",[e._v("null")]),e._v(", "),t("code",[e._v("true")]),e._v(" can't be coerced.")]),e._v(" "),t("h2",{attrs:{id:"coercion-from-null"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-from-null"}},[e._v("#")]),e._v(" Coercion from null")]),e._v(" "),t("h4",{attrs:{id:"to-string-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-string-type-3"}},[e._v("#")]),e._v(" To string type")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to the empty string.")]),e._v(" "),t("h4",{attrs:{id:"to-number-integer-types-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-number-integer-types-2"}},[e._v("#")]),e._v(" To number/integer types")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to "),t("code",[e._v("0")])]),e._v(" "),t("h4",{attrs:{id:"to-boolean-type-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-boolean-type-3"}},[e._v("#")]),e._v(" To boolean type")]),e._v(" "),t("p",[t("code",[e._v("null")]),e._v(" coerces to "),t("code",[e._v("false")])]),e._v(" "),t("h2",{attrs:{id:"coercion-to-and-from-array"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coercion-to-and-from-array"}},[e._v("#")]),e._v(" Coercion to and from array")]),e._v(" "),t("p",[e._v("These coercions require that the option "),t("code",[e._v("coerceTypes")]),e._v(" is "),t("code",[e._v('"array"')]),e._v(".")]),e._v(" "),t("p",[e._v("If a scalar data is present and array is required, Ajv wraps scalar data in an array.")]),e._v(" "),t("p",[e._v("If an array with one item is present and a scalar is required, Ajv coerces array into its item.")]),e._v(" "),t("ul",[t("li",[t("code",[e._v('"foo"')]),e._v(" -> "),t("code",[e._v('[ "foo" ]')])]),e._v(" "),t("li",[t("code",[e._v('[ "foo" ]')]),e._v(" -> "),t("code",[e._v('"foo"')])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/48.688ea8b6.js b/assets/js/48.688ea8b6.js new file mode 100644 index 000000000..45bace777 --- /dev/null +++ b/assets/js/48.688ea8b6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{395:function(e,t,a){"use strict";a.r(t);var r=a(14),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"code-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#code-components"}},[e._v("#")]),e._v(" Code components")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#ajv-classes"}},[e._v("Ajv classes")])]),t("li",[t("a",{attrs:{href:"#schema-compilation"}},[e._v("Schema compilation")])]),t("li",[t("a",{attrs:{href:"#other-components"}},[e._v("Other components")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"ajv-classes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ajv-classes"}},[e._v("#")]),e._v(" Ajv classes")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/core.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/core.ts"),t("OutboundLink")],1),e._v(" - core Ajv class without any keywords. All Ajv methods for managing schemas and extensions are defined in this class.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/ajv.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/ajv.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Schema draft-07 keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/2019.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/2019.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Schema draft-2019-09 keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/jtd.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/jtd.ts"),t("OutboundLink")],1),e._v(" - subclass of Ajv core with JSON Type Definition support.")]),e._v(" "),t("h2",{attrs:{id:"schema-compilation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#schema-compilation"}},[e._v("#")]),e._v(" Schema compilation")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile"),t("OutboundLink")],1),e._v(" - code for schema compilation")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/index.ts"),t("OutboundLink")],1),e._v(" - the main recursive function code for schema compilation, functions for reference resolution, the interface for schema compilation context ("),t("code",[e._v("SchemaCxt")]),e._v(").")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/context.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/context.ts"),t("OutboundLink")],1),e._v(" - the class for keyword code generation "),t("code",[e._v("KeywordCxt")]),e._v(". All pre-defined keywords and user-defined keywords that use "),t("code",[e._v("code")]),e._v(" function are passed an instance of this class.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/rules.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/rules.ts"),t("OutboundLink")],1),e._v(" - data structure to store references to all all keyword definitions that were added to Ajv instance, organised by data type.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/subschema.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/subschema.ts"),t("OutboundLink")],1),e._v(" - creates schema context ("),t("code",[e._v("SchemaCxt")]),e._v(") to generate code for subschemas - used by all applicator keywords in "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies/applicator",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/vocabularies/applicator"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/codegen"),t("OutboundLink")],1),e._v(" - the api for "),t("RouterLink",{attrs:{to:"/codegen.html"}},[e._v("code generation")]),e._v(".")],1),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/compile/validate"),t("OutboundLink")],1),e._v(" - code to iterate the schema to generate code of validation function.")]),e._v(" "),t("h2",{attrs:{id:"other-components"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#other-components"}},[e._v("#")]),e._v(" Other components")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/standalone",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/standalone"),t("OutboundLink")],1),e._v(" - module to generate "),t("RouterLink",{attrs:{to:"/standalone.html"}},[e._v("standalone validation code")]),e._v(".")],1),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/vocabularies",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/vocabularies"),t("OutboundLink")],1),e._v(" - pre-defined validation keywords.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/refs",target:"_blank",rel:"noopener noreferrer"}},[e._v("lib/refs"),t("OutboundLink")],1),e._v(" - JSON Schema meta-schemas.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/52.021ab645.js b/assets/js/52.021ab645.js new file mode 100644 index 000000000..38a8289f5 --- /dev/null +++ b/assets/js/52.021ab645.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{401:function(t,a,s){"use strict";s.r(a);var e=s(14),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"combining-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#combining-schemas"}},[t._v("#")]),t._v(" Combining schemas")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#a-name-ref-a-combining-schemas-with-ref"}},[a("a",{attrs:{name:"ref"}}),t._v("Combining schemas with $ref")])]),a("li",[a("a",{attrs:{href:"#extending-recursive-schemas"}},[t._v("Extending recursive schemas")])]),a("li",[a("a",{attrs:{href:"#data-reference"}},[t._v("$data reference")])]),a("li",[a("a",{attrs:{href:"#merge-and-patch-keywords"}},[t._v("$merge and $patch keywords")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"combining-schemas-with-ref"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#combining-schemas-with-ref"}},[t._v("#")]),t._v(" "),a("a",{attrs:{name:"ref"}}),t._v("Combining schemas with $ref")]),t._v(" "),a("p",[t._v("You can structure your validation logic across multiple schema files and have schemas reference each other using "),a("code",[t._v("$ref")]),t._v(" keyword.")]),t._v(" "),a("p",[t._v("Example:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/schema.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"defs.json#/definitions/int"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"defs.json#/definitions/str"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" defsSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/defs.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("int")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("str")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Now to compile your schema you can either pass all schemas to Ajv instance:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemas")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" defsSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/schemas/schema.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("or use "),a("code",[t._v("addSchema")]),t._v(" method:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("defsSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/options.html"}},[t._v("Options")]),t._v(" and "),a("RouterLink",{attrs:{to:"/api.html#add-schema"}},[t._v("addSchema")]),t._v(" method.")],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Reference resolution")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("$ref")]),t._v(" is resolved as the uri-reference using schema $id as the base URI (see the example).")]),t._v(" "),a("li",[t._v("References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.).")]),t._v(" "),a("li",[t._v("You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs.")]),t._v(" "),a("li",[t._v("The actual location of the schema file in the file system is not used.")]),t._v(" "),a("li",[t._v("You can pass the identifier of the schema as the second parameter of "),a("code",[t._v("addSchema")]),t._v(" method or as a property name in "),a("code",[t._v("schemas")]),t._v(" option. This identifier can be used instead of (or in addition to) schema $id.")]),t._v(" "),a("li",[t._v("You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown.")]),t._v(" "),a("li",[t._v("You can implement dynamic resolution of the referenced schemas using "),a("code",[t._v("compileAsync")]),t._v(" method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See "),a("RouterLink",{attrs:{to:"/guide/managing-schemas.html#asynchronous-schema-compilation"}},[t._v("Asynchronous schema compilation")]),t._v(".")],1)])]),t._v(" "),a("h2",{attrs:{id:"extending-recursive-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#extending-recursive-schemas"}},[t._v("#")]),t._v(" Extending recursive schemas")]),t._v(" "),a("p",[t._v("While statically defined "),a("code",[t._v("$ref")]),t._v(" keyword allows to split schemas to multiple files, it is difficult to extend recursive schemas - the recursive reference(s) in the original schema points to the original schema, and not to the extended one. So in JSON Schema draft-07 the only available solution to extend the recursive schema was to redefine all sections of the original schema that have recursion.")]),t._v(" "),a("p",[t._v("It was particularly repetitive when extending meta-schema, as it has many recursive references, but even in a schema with a single recursive reference extending it was very verbose.")]),t._v(" "),a("p",[t._v("JSON Schema draft-2019-09 and the upcoming draft defined the mechanism for dynamic recursion using keywords "),a("code",[t._v("$recursiveRef")]),t._v("/"),a("code",[t._v("$recursiveAnchor")]),t._v(" (draft-2019-09) or "),a("code",[t._v("$dynamicRef")]),t._v("/"),a("code",[t._v("$dynamicAnchor")]),t._v(' (the next JSON Schema draft) that is somewhat similar to "open recursion" in functional programming.')]),t._v(" "),a("p",[t._v("Consider this recursive schema with static recursion:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" treeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The only way to extend this schema to prohibit additional properties is by adding "),a("code",[t._v("additionalProperties")]),t._v(" keyword right in the schema - this approach can be impossible if you do not control the source of the original schema. Ajv also provided the additional keywords in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" package to extend schemas by treating them as plain JSON data. While this approach may work for you, it is non-standard and therefore not portable.")]),t._v(" "),a("p",[t._v("The new keywords for dynamic recursive references allow extending this schema without modifying it:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" treeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveAnchor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("children")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveRef")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" strictTreeSchema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$id")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/strict-tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$recursiveAnchor")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("unevaluatedProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv2019 "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/2019"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// const Ajv2019 = require("ajv/dist/2019")')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv2019")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemas")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("treeSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" strictTreeSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://example.com/strict-tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/dynamic-ref.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("dynamic-refs"),a("OutboundLink")],1),t._v(" test for the example using "),a("code",[t._v("$dynamicAnchor")]),t._v("/"),a("code",[t._v("$dynamicRef")]),t._v(".")]),t._v(" "),a("p",[t._v("At the moment Ajv implements the spec for dynamic recursive references with these limitations:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("$recursiveAnchor")]),t._v("/"),a("code",[t._v("$dynamicAnchor")]),t._v(" can only be used in the schema root.")]),t._v(" "),a("li",[a("code",[t._v("$recursiveRef")]),t._v("/"),a("code",[t._v("$dynamicRef")]),t._v(" can only be hash fragments, without URI.")])]),t._v(" "),a("p",[t._v("Ajv also does not support dynamic references in "),a("a",{attrs:{href:"#asynchronous-validation"}},[t._v("asynchronous schemas")]),t._v(" (Ajv extension) - it is assumed that the referenced schema is synchronous, and there is no validation-time check for it.")]),t._v(" "),a("h2",{attrs:{id:"data-reference"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-reference"}},[t._v("#")]),t._v(" $data reference")]),t._v(" "),a("p",[t._v("With "),a("code",[t._v("$data")]),t._v(" option you can use values from the validated data as the values for the schema keywords. See "),a("a",{attrs:{href:"https://github.com/json-schema-org/json-schema-spec/issues/51",target:"_blank",rel:"noopener noreferrer"}},[t._v("proposal"),a("OutboundLink")],1),t._v(" for more information about how it works.")]),t._v(" "),a("p",[a("code",[t._v("$data")]),t._v(" reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems.")]),t._v(" "),a("p",[t._v('The value of "$data" should be a '),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc6901/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON-pointer"),a("OutboundLink")],1),t._v(" to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a "),a("a",{attrs:{href:"http://tools.ietf.org/html/draft-luff-relative-json-pointer-00",target:"_blank",rel:"noopener noreferrer"}},[t._v("relative JSON-pointer"),a("OutboundLink")],1),t._v(" (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema).")]),t._v(" "),a("p",[t._v("Examples.")]),t._v(" "),a("p",[t._v("This schema requires that the value in property "),a("code",[t._v("smaller")]),t._v(" is less or equal than the value in the property larger:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("smaller")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1/larger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("larger")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validData "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("smaller")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("larger")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" validData"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n")])])]),a("p",[t._v("This schema requires that the properties have the same format as their field names:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$data")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0#"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validData "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"date-time"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1963-06-19T08:30:06.283185Z"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("email")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"joe.bloggs@example.com"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("$data")]),t._v(" reference is resolved safely - it won't throw even if some property is undefined. If "),a("code",[t._v("$data")]),t._v(" resolves to "),a("code",[t._v("undefined")]),t._v(" the validation succeeds (with the exclusion of "),a("code",[t._v("const")]),t._v(" keyword). If "),a("code",[t._v("$data")]),t._v(' resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails.')]),t._v(" "),a("h2",{attrs:{id:"merge-and-patch-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#merge-and-patch-keywords"}},[t._v("#")]),t._v(" $merge and $patch keywords")]),t._v(" "),a("p",[t._v("With the package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" you can use the keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" that allow extending JSON Schemas with patches using formats "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc7396/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Merge Patch (RFC 7396)"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc6902/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Patch (RFC 6902)"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("To add keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" to Ajv instance use this code:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-merge-patch"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("Examples.")]),t._v(" "),a("p",[t._v("Using "),a("code",[t._v("$merge")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$merge")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("q")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Using "),a("code",[t._v("$patch")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("$patch")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("source")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("with")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("op")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("path")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/properties/q"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The schemas above are equivalent to this schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("p")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("q")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The properties "),a("code",[t._v("source")]),t._v(" and "),a("code",[t._v("with")]),t._v(" in the keywords "),a("code",[t._v("$merge")]),t._v(" and "),a("code",[t._v("$patch")]),t._v(" can use absolute or relative "),a("code",[t._v("$ref")]),t._v(" to point to other schemas previously added to the Ajv instance or to the fragments of the current schema.")]),t._v(" "),a("p",[t._v("See the package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-merge-patch",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-merge-patch"),a("OutboundLink")],1),t._v(" for more information.")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/53.6a790be8.js b/assets/js/53.6a790be8.js new file mode 100644 index 000000000..721dade38 --- /dev/null +++ b/assets/js/53.6a790be8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{400:function(t,a,s){"use strict";s.r(a);var e=s(14),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"execution-environments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#execution-environments"}},[t._v("#")]),t._v(" Execution environments")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#server-side-node-js"}},[t._v("Server-side Node.js")])]),a("li",[a("a",{attrs:{href:"#short-lived-environments"}},[t._v("Short-lived environments")])]),a("li",[a("a",{attrs:{href:"#browsers"}},[t._v("Browsers")])]),a("li",[a("a",{attrs:{href:"#es5-environments"}},[t._v("ES5 environments")])]),a("li",[a("a",{attrs:{href:"#cjs-vs-esm-exports"}},[t._v("CJS vs ESM exports")])]),a("li",[a("a",{attrs:{href:"#other-javascript-environments"}},[t._v("Other JavaScript environments")])]),a("li",[a("a",{attrs:{href:"#command-line-interface"}},[t._v("Command line interface")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"server-side-node-js"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-side-node-js"}},[t._v("#")]),t._v(" Server-side Node.js")]),t._v(" "),a("p",[t._v("The main consideration for using Ajv server-side is to "),a("a",{attrs:{href:"./managing-schemas"}},[t._v("manage compiled schemas")]),t._v(" correctly, ensuring that the same schema is not compiled more than once.")]),t._v(" "),a("h2",{attrs:{id:"short-lived-environments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#short-lived-environments"}},[t._v("#")]),t._v(" Short-lived environments")]),t._v(" "),a("p",[t._v('Depending on the life-time of the environments, the benefits from "compile once - validate many times" model can be limited - you can consider using '),a("a",{attrs:{href:"../standalone"}},[t._v("standalone validation code")]),t._v(".")]),t._v(" "),a("p",[t._v("If you have a pre-defined set of schemas, you can:")]),t._v(" "),a("ol",[a("li",[t._v("compile all schemas in the build step - you can either write your own script or use "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-cli"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[t._v("generate and beautify standalone validation code - you can have all your schemas exported from one file.")]),t._v(" "),a("li",[t._v("additionally, you can inline all dependencies on Ajv or ajv-formats using any bundling tools.")]),t._v(" "),a("li",[t._v("deploy compiled schemas as part of your application or library (with or without dependency on Ajv, depending on whether you did step 3 and which validation keywords are used in the schemas)")])]),t._v(" "),a("p",[t._v("Please see "),a("a",{attrs:{href:"https://github.com/gajus/table",target:"_blank",rel:"noopener noreferrer"}},[t._v("gajus/table"),a("OutboundLink")],1),t._v(" package that pre-compiles schemas in this way.")]),t._v(" "),a("p",[t._v("Even if your schemas need to be stored in the database, you can still compile schemas once and store your validation functions alongside schemas in the database as well, loading them on demand.")]),t._v(" "),a("h2",{attrs:{id:"browsers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#browsers"}},[t._v("#")]),t._v(" Browsers")]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/security.html#content-security-policy"}},[t._v("Content Security Policy")]),t._v(" to decide how best to use Ajv in the browser for your use case.")],1),t._v(" "),a("p",[t._v("Whether you compile schemas in the browser or use "),a("a",{attrs:{href:"../standalone"}},[t._v("standalone validation code")]),t._v(", it is recommended that you bundle them together with your application code.")]),t._v(" "),a("p",[t._v("If you need to use Ajv in several application bundles you can create a separate UMD bundles of Ajv using "),a("code",[t._v("npm run bundle")]),t._v(" script.")]),t._v(" "),a("p",[t._v("In this case you need to load Ajv using the correct bundle, depending on which schema language and which version you need to use:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JSON Schema (draft-07)"}},[a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle/ajv7.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ajv7\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"JSON Schema (draft-2019-09)"}},[a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle/ajv2019.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ajv2019\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"JSON Type Definition"}},[a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("bundle/ajvJTD.min.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}},[a("span",{pre:!0,attrs:{class:"token language-javascript"}},[t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ajvJTD\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])])])],1),t._v(" "),a("p",[t._v("This bundle can be used with different module systems; it creates global "),a("code",[t._v("ajv")]),t._v("/"),a("code",[t._v("ajv2019")]),t._v("/"),a("code",[t._v("ajvJTD")]),t._v(" if no module system is found.")]),t._v(" "),a("p",[t._v("The browser bundles are available on "),a("a",{attrs:{href:"https://cdnjs.com/libraries/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("cdnjs"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Some frameworks re-define require")]),t._v(" "),a("p",[t._v("Some frameworks, e.g. Dojo, may redefine global require in a way that is not compatible with CommonJS module format. In this case Ajv bundle has to be loaded before the framework and then you can use global "),a("code",[t._v("ajv")]),t._v(" (see issue "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/234",target:"_blank",rel:"noopener noreferrer"}},[t._v("#234"),a("OutboundLink")],1),t._v(").")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Internet Explorer 11")]),t._v(" "),a("p",[t._v("Ajv v8 in IE 11 will not work straight out of the box. To use it either "),a("RouterLink",{attrs:{to:"/standalone.html"}},[t._v("recompile it")]),t._v(", or set the options "),a("RouterLink",{attrs:{to:"/options.html#unicoderegexp"}},[t._v("unicodeRegExp")]),t._v(" to "),a("code",[t._v("false")]),t._v(" and "),a("code",[t._v("code: { es5: true }")]),t._v(", and transpile the Ajv node module (see issue "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/1585#issuecomment-832486204",target:"_blank",rel:"noopener noreferrer"}},[t._v("#1585"),a("OutboundLink")],1),t._v(").")],1)]),t._v(" "),a("h2",{attrs:{id:"es5-environments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#es5-environments"}},[t._v("#")]),t._v(" ES5 environments")]),t._v(" "),a("p",[t._v("You need to:")]),t._v(" "),a("ul",[a("li",[t._v("recompile Typescript to ES5 target - it is set to 2018 in the bundled compiled code.")]),t._v(" "),a("li",[t._v("generate ES5 validation code:")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("code")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("es5")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/docs/api.md#advanced-options",target:"_blank",rel:"noopener noreferrer"}},[t._v("Advanced options"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"cjs-vs-esm-exports"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cjs-vs-esm-exports"}},[t._v("#")]),t._v(" CJS vs ESM exports")]),t._v(" "),a("p",[t._v("The default configuration of AJV is to generate code in ES6 with Common JS (CJS) exports. This can be changed by setting\nthe ES Modules(ESM) flag.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("code")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("esm")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"other-javascript-environments"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#other-javascript-environments"}},[t._v("#")]),t._v(" Other JavaScript environments")]),t._v(" "),a("p",[t._v("Ajv is used in other JavaScript environments, including Electron apps, WeChat mini-apps and many others, where the same considerations apply as above:")]),t._v(" "),a("ul",[a("li",[t._v("compilation performance")]),t._v(" "),a("li",[t._v("restrictive content security policy")]),t._v(" "),a("li",[t._v("bundle size")])]),t._v(" "),a("p",[t._v("If any of this is important, you may have better results with pre-compiled "),a("a",{attrs:{href:"../standalone"}},[t._v("standalone validation code")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"command-line-interface"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#command-line-interface"}},[t._v("#")]),t._v(" Command line interface")]),t._v(" "),a("p",[t._v("Ajv can be used from the terminal in any operating system supported by Node.js")]),t._v(" "),a("p",[t._v("CLI is available as a separate npm package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-cli",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-cli"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("It supports:")]),t._v(" "),a("ul",[a("li",[t._v("compiling JSON Schemas to test their validity")]),t._v(" "),a("li",[t._v("generating "),a("RouterLink",{attrs:{to:"/guide/docs/standalone.html"}},[t._v("standalone validation code")]),t._v(" that exports validation function(s)")],1),t._v(" "),a("li",[t._v("migrating schemas to draft-07 and draft-2019-09 (using "),a("a",{attrs:{href:"https://github.com/epoberezkin/json-schema-migrate",target:"_blank",rel:"noopener noreferrer"}},[t._v("json-schema-migrate"),a("OutboundLink")],1),t._v(")")]),t._v(" "),a("li",[t._v("validating data file(s) against JSON Schema")]),t._v(" "),a("li",[t._v("testing expected validity of data against JSON Schema")]),t._v(" "),a("li",[t._v("referenced schemas")]),t._v(" "),a("li",[t._v("user-defined meta-schemas, validation keywords and formats")]),t._v(" "),a("li",[t._v("files in JSON, JSON5, YAML, and JavaScript format")]),t._v(" "),a("li",[t._v("all Ajv options")]),t._v(" "),a("li",[t._v("reporting changes in data after validation in "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc6902/",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON-patch"),a("OutboundLink")],1),t._v(" format")])])],1)}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/57.4c47bf28.js b/assets/js/57.4c47bf28.js new file mode 100644 index 000000000..e76b389e0 --- /dev/null +++ b/assets/js/57.4c47bf28.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{408:function(t,a,s){"use strict";s.r(a);var e=s(14),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"modifying-data-during-validation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modifying-data-during-validation"}},[t._v("#")]),t._v(" Modifying data during validation")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#general-considerations"}},[t._v("General considerations")])]),a("li",[a("a",{attrs:{href:"#removing-additional-properties"}},[t._v("Removing additional properties")])]),a("li",[a("a",{attrs:{href:"#assigning-defaults"}},[t._v("Assigning defaults")])]),a("li",[a("a",{attrs:{href:"#coercing-data-types"}},[t._v("Coercing data types")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"general-considerations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-considerations"}},[t._v("#")]),t._v(" General considerations")]),t._v(" "),a("p",[t._v("Ajv has several options that allow to modify data during validation:")]),t._v(" "),a("ul",[a("li",[t._v("removeAdditional - to remove properties not defined in the schema object.")]),t._v(" "),a("li",[t._v("useDefaults - to assign defaults from the schema to the validated data properties.")]),t._v(" "),a("li",[t._v("coerceTypes - to change data type, when possible, to match the type(s) in the schema.")])]),t._v(" "),a("p",[t._v("You can also define keywords that modify data.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("NOT possible to modify root data")]),t._v(" "),a("p",[t._v("It is not possible to modify the root data instance passed to the validation function, only data properties can be modified. This is related to how JavaScript passes parameters, and not a limitation of Ajv.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Non-portable functionality")]),t._v(" "),a("p",[t._v("This functionality is non-standard - this is likely to be unsupported in other JSON Schema validator implementations.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("Unexpected results when modifying data")]),t._v(" "),a("p",[t._v("While pure schema validation produces the results independent of the keywords and subschema order, enabling any feature that may modify the data makes validation impure and its results are likely to depend on the order of evaluation of keywords and subschemas.")]),t._v(" "),a("p",[t._v("The order of evaluation of subschemas in keywords like "),a("code",[t._v("allOf")]),t._v(" is always the same as the order of subschemas in the array.")]),t._v(" "),a("p",[t._v("On another hand, the order of evaluation of keywords, while consistent between validations and not dependent on how schema object is created, is neither documented nor guaranteed, so it can change in the future major versions (and, in rare cases, it can change in minor version - e.g. when there is bug that needs to be fixed).")]),t._v(" "),a("p",[t._v("It is strongly recommended to always put user-defined keywords that can mutate data in separate subschemas inside "),a("code",[t._v("allOf")]),t._v(" keyword to make the order of evaluation unambiguous. The exceptions to this recommendation are pre-defined "),a("code",[t._v("default")]),t._v(" and "),a("code",[t._v("type")]),t._v(" keywords - they must remain in the same schema as other keywords.")])]),t._v(" "),a("h2",{attrs:{id:"removing-additional-properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#removing-additional-properties"}},[t._v("#")]),t._v(" Removing additional properties")]),t._v(" "),a("p",[t._v("With "),a("RouterLink",{attrs:{to:"/guide/api.html#options"}},[t._v("option "),a("code",[t._v("removeAdditional")])]),t._v(" (added by "),a("a",{attrs:{href:"https://github.com/andyscott",target:"_blank",rel:"noopener noreferrer"}},[t._v("andyscott"),a("OutboundLink")],1),t._v(") you can filter data during the validation.")],1),t._v(" "),a("p",[t._v("This option modifies original data.")]),t._v(" "),a("p",[t._v("Example:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("removeAdditional")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baz")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additional1")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// will be removed; `additionalProperties` == false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baz")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additional2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// will NOT be removed; `additionalProperties` != false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "foo": 0, "bar": { "baz": "abc", "additional2": 2 }')]),t._v("\n")])])]),a("p",[t._v("If "),a("code",[t._v("removeAdditional")]),t._v(" option in the example above were "),a("code",[t._v('"all"')]),t._v(" then both "),a("code",[t._v("additional1")]),t._v(" and "),a("code",[t._v("additional2")]),t._v(" properties would have been removed.")]),t._v(" "),a("p",[t._v("If the option were "),a("code",[t._v('"failing"')]),t._v(" then property "),a("code",[t._v("additional1")]),t._v(" would have been removed regardless of its value and property "),a("code",[t._v("additional2")]),t._v(" would have been removed only if its value were failing the schema in the inner "),a("code",[t._v("additionalProperties")]),t._v(" (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed).")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Unexpected results when using removeAdditional with anyOf/oneOf")]),t._v(" "),a("p",[t._v("If you use "),a("code",[t._v("removeAdditional")]),t._v(" option with "),a("code",[t._v("additionalProperties")]),t._v(" keyword inside "),a("code",[t._v("anyOf")]),t._v("/"),a("code",[t._v("oneOf")]),t._v(" keywords your validation can fail with this schema. To make it work as you expect, you have to use discriminated union with "),a("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[t._v("discriminator")]),t._v(" keyword (requires "),a("code",[t._v("discriminator")]),t._v(" option).")],1)]),t._v(" "),a("p",[t._v("For example, with this non-discriminated union you will have unexpected results:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oneOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('The intention of the schema above is to allow objects with either the string property "foo" or the integer property "bar", but not with both and not with any other properties.')]),t._v(" "),a("p",[t._v("With the option "),a("code",[t._v("removeAdditional: true")]),t._v(" the validation will pass for the object "),a("code",[t._v('{ "foo": "abc"}')]),t._v(" but will fail for the object "),a("code",[t._v('{"bar": 1}')]),t._v(". It happens because while the first subschema in "),a("code",[t._v("oneOf")]),t._v(" is validated, the property "),a("code",[t._v("bar")]),t._v(" is removed because it is an additional property according to the standard (because it is not included in "),a("code",[t._v("properties")]),t._v(" keyword in the same schema).")]),t._v(" "),a("p",[t._v("While this behaviour is unexpected (issues "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/129",target:"_blank",rel:"noopener noreferrer"}},[t._v("#129"),a("OutboundLink")],1),t._v(", "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/134",target:"_blank",rel:"noopener noreferrer"}},[t._v("#134"),a("OutboundLink")],1),t._v("), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oneOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The schema above is also more efficient - it will compile into a faster function.")]),t._v(" "),a("p",[t._v("For discriminated unions you could schemas with "),a("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[t._v("discriminator")]),t._v(" keyword (it requires "),a("code",[t._v("discriminator: true")]),t._v(" option):")],1),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("propertyName")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tag"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("oneOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("tag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("tag")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("With this schema, only one subschema in "),a("code",[t._v("oneOf")]),t._v(" will be evaluated, so "),a("code",[t._v("removeAdditional")]),t._v(" option will work as expected.")]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[t._v("discriminator")]),t._v(" keyword.")],1),t._v(" "),a("h2",{attrs:{id:"assigning-defaults"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#assigning-defaults"}},[t._v("#")]),t._v(" Assigning defaults")]),t._v(" "),a("p",[t._v("With "),a("RouterLink",{attrs:{to:"/guide/options.html#options"}},[t._v("option "),a("code",[t._v("useDefaults")])]),t._v(" Ajv will assign values from "),a("code",[t._v("default")]),t._v(" keyword in the schemas of "),a("code",[t._v("properties")]),t._v(" and "),a("code",[t._v("items")]),t._v(" (when it is the array of schemas) to the missing properties and items.")],1),t._v(" "),a("p",[t._v("With the option value "),a("code",[t._v('"empty"')]),t._v(" properties and items equal to "),a("code",[t._v("null")]),t._v(" or "),a("code",[t._v('""')]),t._v(" (empty string) will be considered missing and assigned defaults.")]),t._v(" "),a("p",[t._v("This option modifies original data.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Defaults are deep-cloned")]),t._v(" "),a("p",[t._v("The default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema.")])]),t._v(" "),a("p",[t._v("Example 1 ("),a("code",[t._v("default")]),t._v(" in "),a("code",[t._v("properties")]),t._v("):")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("useDefaults")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "foo": 1, "bar": "baz" }')]),t._v("\n")])])]),a("p",[t._v("Example 2 ("),a("code",[t._v("default")]),t._v(" in "),a("code",[t._v("items")]),t._v("):")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// [ 1, "foo" ]')]),t._v("\n")])])]),a("p",[t._v("With "),a("code",[t._v("useDefaults")]),t._v(" option "),a("code",[t._v("default")]),t._v(" keywords throws exception during schema compilation when used in:")]),t._v(" "),a("ul",[a("li",[t._v("not in "),a("code",[t._v("properties")]),t._v(" or "),a("code",[t._v("items")]),t._v(" subschemas")]),t._v(" "),a("li",[t._v("in schemas inside "),a("code",[t._v("anyOf")]),t._v(", "),a("code",[t._v("oneOf")]),t._v(" and "),a("code",[t._v("not")]),t._v(" (see "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/42",target:"_blank",rel:"noopener noreferrer"}},[t._v("#42"),a("OutboundLink")],1),t._v(")")]),t._v(" "),a("li",[t._v("in "),a("code",[t._v("if")]),t._v(" schema")]),t._v(" "),a("li",[t._v("in schemas generated by user-defined "),a("em",[t._v("macro")]),t._v(" keywords")])]),t._v(" "),a("p",[t._v("The strict mode option can change the behaviour for these unsupported defaults ("),a("code",[t._v("strict: false")]),t._v(" to ignore them, "),a("code",[t._v('"log"')]),t._v(" to log a warning).")]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/guide/strict-mode.html"}},[t._v("Strict mode")]),t._v(".")],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Default with discriminator keyword")]),t._v(" "),a("p",[t._v("Defaults will be assigned in schemas inside "),a("code",[t._v("oneOf")]),t._v(" in case "),a("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[t._v("discriminator")]),t._v(" keyword is used.")],1)]),t._v(" "),a("h2",{attrs:{id:"coercing-data-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#coercing-data-types"}},[t._v("#")]),t._v(" Coercing data types")]),t._v(" "),a("p",[t._v("When you are validating user inputs all your data properties are usually strings. The option "),a("code",[t._v("coerceTypes")]),t._v(" allows you to have your data types coerced to the types specified in your schema "),a("code",[t._v("type")]),t._v(" keywords, both to pass the validation and to use the correctly typed data afterwards.")]),t._v(" "),a("p",[t._v("This option modifies original data.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Type coercion with scalar values")]),t._v(" "),a("p",[t._v("If you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value.")])]),t._v(" "),a("p",[t._v("Example 1:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("coerceTypes")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"false"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "foo": 1, "bar": false }')]),t._v("\n")])])]),a("p",[t._v("Example 2 (array coercions):")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("coerceTypes")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"false"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// { "foo": [1], "bar": false }')]),t._v("\n")])])]),a("p",[t._v('The coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of "anyOf" and other compound keywords).')]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/coercion.html"}},[t._v("Type coercion rules")]),t._v(" for details.")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/59.8be7d720.js b/assets/js/59.8be7d720.js new file mode 100644 index 000000000..41012f1e5 --- /dev/null +++ b/assets/js/59.8be7d720.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{406:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"using-with-typescript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-with-typescript"}},[t._v("#")]),t._v(" Using with TypeScript")]),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#additional-functionality"}},[t._v("Additional functionality")])]),s("li",[s("a",{attrs:{href:"#utility-types-for-schemas"}},[t._v("Utility types for schemas")])]),s("li",[s("a",{attrs:{href:"#utility-type-for-jtd-data-type"}},[t._v("Utility type for JTD data type")])]),s("li",[s("a",{attrs:{href:"#type-safe-error-handling"}},[t._v("Type-safe error handling")])]),s("li",[s("a",{attrs:{href:"#type-safe-parsers-and-serializers"}},[t._v("Type-safe parsers and serializers")])]),s("li",[s("a",{attrs:{href:"#type-safe-unions"}},[t._v("Type-safe unions")])])])]),s("p"),t._v(" "),s("h2",{attrs:{id:"additional-functionality"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#additional-functionality"}},[t._v("#")]),t._v(" Additional functionality")]),t._v(" "),s("p",[t._v("Ajv takes advantage of TypeScript type system to provide additional functionality that is not possible in JavaScript:")]),t._v(" "),s("ul",[s("li",[t._v("utility types "),s("code",[t._v("JSONSchemaType")]),t._v(" and "),s("code",[t._v("JTDSchemaType")]),t._v(" to convert data type into the schema type to simplify writing schemas, both for "),s("RouterLink",{attrs:{to:"/json-schema.html"}},[t._v("JSON Schema")]),t._v(" (but without union support) and for "),s("a",{attrs:{href:"../json-type-definition"}},[t._v("JSON Type Definition")]),t._v(" (with tagged unions support).")],1),t._v(" "),s("li",[t._v("utility type "),s("code",[t._v("JTDDataType")]),t._v(" to convert JSON Type Definition schema into the type of data that it defines.")]),t._v(" "),s("li",[t._v("compiled validation functions are type guards that narrow the type after successful validation.")]),t._v(" "),s("li",[t._v("validation errors for JSON Schema are defined as tagged unions, for type-safe error handling.")]),t._v(" "),s("li",[t._v("when utility type is used, compiled JTD serializers only accept data of correct type (as they do not validate that the data is valid) and compiled parsers return correct data type.")])]),t._v(" "),s("h2",{attrs:{id:"utility-types-for-schemas"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#utility-types-for-schemas"}},[t._v("#")]),t._v(" Utility types for schemas")]),t._v(" "),s("p",[t._v("For the same example as in "),s("a",{attrs:{href:"./getting-started"}},[t._v("Getting started")]),t._v(":")]),t._v(" "),s("ul",[s("li",[t._v("ensure strictNullChecks is true")])]),t._v(" "),s("code-group",[s("code-block",{attrs:{title:"JSON Schema"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JSONSchemaType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyData")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JSONSchemaType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyData"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nullable"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n required"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n additionalProperties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// validate is a type guard for MyData - type is inferred from schema type")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or, if you did not use type annotation for the schema,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type parameter can be used to make it type guard:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const validate = ajv.compile(schema)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])]),t._v(" "),s("code-block",{attrs:{title:"JSON Type Definition"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JTDSchemaType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyData")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyData"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// validate is a type guard for MyData - type is inferred from schema type")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or, if you did not use type annotation for the schema,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type parameter can be used to make it type guard:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const validate = ajv.compile(schema)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])],1),t._v(" "),s("p",[t._v("See "),s("a",{attrs:{href:"https://github.com/ajv-validator/ajv/tree/master/spec/types/json-schema.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("this test"),s("OutboundLink")],1),t._v(" for an advanced example.")]),t._v(" "),s("h2",{attrs:{id:"utility-type-for-jtd-data-type"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#utility-type-for-jtd-data-type"}},[t._v("#")]),t._v(" Utility type for JTD data type")]),t._v(" "),s("p",[t._v("You can use JTD schema to construct the type of data using utility type "),s("code",[t._v("JTDDataType")])]),t._v(" "),s("code-group",[s("code-block",{attrs:{title:"JSON Type Definition"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JTDDataType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyData")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JTDDataType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" schema"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type inference is not supported for JTDDataType yet")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-function"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyData"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])],1),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("TypeScript limitation")]),t._v(" "),s("p",[t._v("Note that it's currently not possible for "),s("code",[t._v("JTDDataType")]),t._v(" to know whether the compiler is inferring timestamps as strings or Dates, and so it conservatively types any timestamp as "),s("code",[t._v("string | Date")]),t._v(". This is accurate, but often requires extra validation on the part of the user to confirm they're getting the appropriate data type.")])]),t._v(" "),s("h2",{attrs:{id:"type-safe-error-handling"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#type-safe-error-handling"}},[t._v("#")]),t._v(" Type-safe error handling")]),t._v(" "),s("p",[t._v("With both "),s("RouterLink",{attrs:{to:"/json-schema.html"}},[t._v("JSON Schema")]),t._v(" and "),s("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JSON Type Definition")]),t._v(", the validation error type is an open union, but it can be cast to tagged unions (using validation keyword as tag) for easier error handling.")],1),t._v(" "),s("p",[t._v("Continuing the example above:")]),t._v(" "),s("code-group",[s("code-block",{attrs:{title:"JSON Schema"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("DefinedError"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The type cast is needed, as Ajv uses a wider type to allow extension")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can extend this type to include your error types as needed.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" err "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" DefinedError"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("keyword"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// err type is narrowed here to have "type" error params properties')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("break")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])]),t._v(" "),s("code-block",{attrs:{title:"JSON Type Definition"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JTDErrorObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The type cast is needed, as Ajv uses a wider type to allow extension")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You can extend this type to include your error types as needed.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" err "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" JTDErrorObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("keyword"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// err type is narrowed here to have "type" error params properties')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("params"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("break")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])],1),t._v(" "),s("h2",{attrs:{id:"type-safe-parsers-and-serializers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#type-safe-parsers-and-serializers"}},[t._v("#")]),t._v(" Type-safe parsers and serializers")]),t._v(" "),s("p",[t._v("With typescript, your compiled parsers and serializers can be type-safe, either taking their type from schema type or from type parameter passed to compilation functions.")]),t._v(" "),s("p",[t._v("This example uses the same data and schema types as above:")]),t._v(" "),s("code-group",[s("code-block",{attrs:{title:"JSON Type Definition"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JTDSchemaType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyData")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyData"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// serialize will only accept data compatible with MyData")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" serialize "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compileSerializer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// parse will return MyData or undefined")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" parse "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compileParser")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// types of parse and serialize are inferred from schema,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// they can also be defined explicitly:")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const parse = ajv.compileParser(schema)")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n bar"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invalidData "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("unknown")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("serialize")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("serialize")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("invalidData"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type error")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" json "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{"foo": 1, "bar": "abc"}\'')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invalidJson "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{"unknown": "abc"}\'')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLogFoo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// logs property")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLogFoo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("invalidJson"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// logs error and position")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLogFoo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// MyData | undefined")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("undefined")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error message from the last parse call")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parse"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("position"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error position in string")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])],1),t._v(" "),s("h2",{attrs:{id:"type-safe-unions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#type-safe-unions"}},[t._v("#")]),t._v(" Type-safe unions")]),t._v(" "),s("p",[t._v("JSON Type Definition only supports tagged unions, so unions in JTD are fully supported for "),s("code",[t._v("JTDSchemaType")]),t._v(" and "),s("code",[t._v("JTDDataType")]),t._v(".\nJSON Schema is more complex and so "),s("code",[t._v("JSONSchemaType")]),t._v(" has limited support for type safe unions.")]),t._v(" "),s("p",[s("code",[t._v("JSONSchemaType")]),t._v(" will type check unions where each union element is fully specified as an element of an "),s("code",[t._v("anyOf")]),t._v(" array or "),s("code",[t._v("oneOf")]),t._v(" array.\nAdditionally, unions of primitives will type check appropriately if they're combined into an array "),s("code",[t._v("type")]),t._v(", e.g. "),s("code",[t._v('{type: ["string", "number"]}')]),t._v(".")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("TypeScript limitation")]),t._v(" "),s("p",[t._v("Note that due to current limitation of TypeScript, JSONSchemaType cannot verify that every element of the union is present, and the following example is still valid "),s("code",[t._v('const schema: JSONSchemaType = {type: "string"}')]),t._v(".")])]),t._v(" "),s("p",[t._v("Here's a more detailed example showing several union types:")]),t._v(" "),s("code-group",[s("code-block",{attrs:{title:"JSON Schema"}},[s("div",{staticClass:"language-typescript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-typescript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JSONSchemaType"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyUnion")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("prop"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JSONSchemaType"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyUnion"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n anyOf"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" prop"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n required"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"prop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])],1)],1)}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/60.e6687b92.js b/assets/js/60.e6687b92.js new file mode 100644 index 000000000..30fc722f6 --- /dev/null +++ b/assets/js/60.e6687b92.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{407:function(t,a,s){"use strict";s.r(a);var e=s(14),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"user-defined-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-keywords"}},[t._v("#")]),t._v(" User-defined keywords")]),t._v(" "),a("p",[t._v("You can extend keyword available in Ajv by defining your own keywords.")]),t._v(" "),a("p",[t._v("The advantages of defining keywords are:")]),t._v(" "),a("ul",[a("li",[t._v("allow creating validation scenarios that cannot be expressed using pre-defined keywords")]),t._v(" "),a("li",[t._v("simplify your schemas")]),t._v(" "),a("li",[t._v("help bringing a bigger part of the validation logic to your schemas")]),t._v(" "),a("li",[t._v("make your schemas more expressive, less verbose and closer to your application domain")]),t._v(" "),a("li",[t._v("implement data processors that modify your data ("),a("code",[t._v("modifying")]),t._v(" option MUST be used in keyword definition) and/or create side effects while the data is being validated")])]),t._v(" "),a("p",[t._v("If a keyword is used only for side-effects and its validation result is pre-defined, use option "),a("code",[t._v("valid: true/false")]),t._v(" in keyword definition to simplify both generated code (no error handling in case of "),a("code",[t._v("valid: true")]),t._v(") and your keyword functions (no need to return any validation result).")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("User-defined keywords make schemas non-portable")]),t._v(" "),a("p",[t._v("When extending JSON Schema standard with additional keywords, you have several potential concerns to be aware of:")]),t._v(" "),a("ul",[a("li",[t._v("portability of your schemas - they would only work with JavaScript or TypeScript applications where you can use Ajv.")]),t._v(" "),a("li",[t._v("additional documentation required to maintain your schemas.")])])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("Avoid using non-standard keywords with JTD schemas")]),t._v(" "),a("p",[t._v("While it is possible to define additional keywords for JSON Type Definition schemas (these keywords can only be used in "),a("code",[t._v("metadata")]),t._v(" member of the schema), it is strongly recommended not to do it - JTD is specifically designed for cross-platform APIs.")])]),t._v(" "),a("p",[t._v("You can define keywords with "),a("RouterLink",{attrs:{to:"/guide/api.html#api-addkeyword"}},[t._v("addKeyword")]),t._v(" method. Keywords are defined on the "),a("code",[t._v("ajv")]),t._v(" instance level - new instances will not have previously defined keywords.")],1),t._v(" "),a("p",[t._v("Ajv allows defining keywords with:")]),t._v(" "),a("ul",[a("li",[t._v("code generation function (used by all pre-defined keywords)")]),t._v(" "),a("li",[t._v("validation function")]),t._v(" "),a("li",[t._v("compilation function")]),t._v(" "),a("li",[t._v("macro function")])]),t._v(" "),a("p",[t._v("Example. "),a("code",[t._v("range")]),t._v(" and "),a("code",[t._v("exclusiveRange")]),t._v(" keywords using compiled schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keyword")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"range"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("schemaType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"exclusiveRange"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("min"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n parentSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exclusiveRange "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" min "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("max")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" min "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" max"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("range")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("exclusiveRange")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.01")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.99")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("p",[t._v("Several keywords (typeof, instanceof, range and propertyNames) are defined in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),a("OutboundLink")],1),t._v(" package - they can be used for your schemas and as a starting point for your own keywords.")]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/keywords.html"}},[t._v("User-defined keywords")]),t._v(" reference for more details.")],1)])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/63.ce51185c.js b/assets/js/63.ce51185c.js new file mode 100644 index 000000000..ff77cda28 --- /dev/null +++ b/assets/js/63.ce51185c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{413:function(t,a,s){"use strict";s.r(a);var e=s(14),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"json-type-definition"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-type-definition"}},[t._v("#")]),t._v(" JSON Type Definition")]),t._v(" "),a("p",[t._v("This document informally describes JSON Type Definition (JTD) specification to help Ajv users to start using it. For formal definition please refer to "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC8927"),a("OutboundLink")],1),t._v(". Please report any contradictions in this document with the specification.")]),t._v(" "),a("p",[t._v("To use JTD schemas you need to import a different Ajv class:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JavaScript"}},[a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("code-block",{attrs:{title:"TypeScript"}},[a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv/dist/jtd"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#jtd-schema-forms"}},[t._v("JTD schema forms")]),a("ul",[a("li",[a("a",{attrs:{href:"#type-form"}},[t._v("Type form "),a("Badge",{attrs:{text:"primitive values"}})],1)]),a("li",[a("a",{attrs:{href:"#enum-form"}},[t._v("Enum form")])]),a("li",[a("a",{attrs:{href:"#elements-form"}},[t._v("Elements form "),a("Badge",{attrs:{text:"arrays"}})],1)]),a("li",[a("a",{attrs:{href:"#properties-form"}},[t._v("Properties form "),a("Badge",{attrs:{text:"objects"}})],1)]),a("li",[a("a",{attrs:{href:"#discriminator-form"}},[t._v("Discriminator form "),a("Badge",{attrs:{text:"tagged union"}})],1)]),a("li",[a("a",{attrs:{href:"#values-form"}},[t._v("Values form "),a("Badge",{attrs:{text:"dictionary"}})],1)]),a("li",[a("a",{attrs:{href:"#ref-form"}},[t._v("Ref form "),a("Badge",{attrs:{text:"reference definitions"}})],1)]),a("li",[a("a",{attrs:{href:"#empty-form"}},[t._v("Empty form "),a("Badge",{attrs:{text:"any data"}})],1)])])]),a("li",[a("a",{attrs:{href:"#jtdschematype"}},[t._v("JTDSchemaType")]),a("ul",[a("li",[a("a",{attrs:{href:"#most-schemas"}},[t._v("Most Schemas")])]),a("li",[a("a",{attrs:{href:"#ref-schemas"}},[t._v("Ref Schemas")])]),a("li",[a("a",{attrs:{href:"#notable-omissions"}},[t._v("Notable Omissions")])])])]),a("li",[a("a",{attrs:{href:"#extending-jtd"}},[t._v("Extending JTD")]),a("ul",[a("li",[a("a",{attrs:{href:"#metadata-schema-member"}},[t._v("Metadata schema member")])]),a("li",[a("a",{attrs:{href:"#union-keyword"}},[t._v("Union keyword")])]),a("li",[a("a",{attrs:{href:"#user-defined-keywords"}},[t._v("User-defined keywords")])])])]),a("li",[a("a",{attrs:{href:"#validation-errors"}},[t._v("Validation errors")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"jtd-schema-forms"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jtd-schema-forms"}},[t._v("#")]),t._v(" JTD schema forms")]),t._v(" "),a("p",[t._v("JTD specification defines 8 different forms that the schema for JSON can take for one of most widely used data types in JSON messages (API requests and responses).")]),t._v(" "),a("p",[t._v("All forms require that:")]),t._v(" "),a("ul",[a("li",[t._v("schema is an object with different members, depending on the form")]),t._v(" "),a("li",[t._v("each form can have:\n"),a("ul",[a("li",[t._v("an optional member "),a("code",[t._v("nullable")]),t._v(" with a boolean value that allows data instance to be JSON "),a("code",[t._v("null")]),t._v(".")]),t._v(" "),a("li",[t._v("an optional member "),a("code",[t._v("metadata")]),t._v(' with an object value that allows to pass any additional information or extend the specification (Ajv defines keyword "union" that can be used inside '),a("code",[t._v("metadata")]),t._v(")")])])])]),t._v(" "),a("p",[t._v("Root schema can have member "),a("code",[t._v("definitions")]),t._v(" that has a dictionary of schemas that can be references from any other schemas using form "),a("code",[t._v("ref")])]),t._v(" "),a("h3",{attrs:{id:"type-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#type-form"}},[t._v("#")]),t._v(" Type form "),a("Badge",{attrs:{text:"primitive values"}})],1),t._v(" "),a("p",[t._v("This form defines a primitive value.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("type")]),t._v(" and an optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[a("code",[t._v("type")]),t._v(" can have one of the following values:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v('"string"')]),t._v(" - defines a string")]),t._v(" "),a("li",[a("code",[t._v('"boolean"')]),t._v(" - defines boolean value "),a("code",[t._v("true")]),t._v(" or "),a("code",[t._v("false")])]),t._v(" "),a("li",[a("code",[t._v('"timestamp"')]),t._v(" - defines timestamp ( accepting either an "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc3339/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC3339"),a("OutboundLink")],1),t._v(" JSON string or a Date object, configurable via the "),a("code",[t._v("timestamp")]),t._v(" Ajv option)")]),t._v(" "),a("li",[a("code",[t._v("type")]),t._v(" values that define integer numbers:\n"),a("ul",[a("li",[a("code",[t._v('"int8"')]),t._v(" - signed byte value (-128 .. 127)")]),t._v(" "),a("li",[a("code",[t._v('"uint8"')]),t._v(" - unsigned byte value (0 .. 255)")]),t._v(" "),a("li",[a("code",[t._v('"int16"')]),t._v(" - signed word value (-32768 .. 32767),")]),t._v(" "),a("li",[a("code",[t._v('"uint16"')]),t._v(" - unsigned word value (0 .. 65535)")]),t._v(" "),a("li",[a("code",[t._v('"int32"')]),t._v(" - signed 32-bit integer value")]),t._v(" "),a("li",[a("code",[t._v('"uint32"')]),t._v(" - unsigned 32-bit integer value")])])]),t._v(" "),a("li",[a("code",[t._v("type")]),t._v(" values that define floating point numbers:\n"),a("ul",[a("li",[a("code",[t._v('"float32"')]),t._v(" - 32-bit real number")]),t._v(" "),a("li",[a("code",[t._v('"float64"')]),t._v(" - 64-bit real number")])])])]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow defining values that can take one of several types, but they can be defined as "),a("code",[t._v("nullable")]),t._v(".")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"enum-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enum-form"}},[t._v("#")]),t._v(" Enum form")]),t._v(" "),a("p",[t._v("This form defines a string that can take one of the values from the list (the values in the list must be unique).")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("enum")]),t._v(" and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow defining "),a("code",[t._v("enum")]),t._v(" with values of any other type than string.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"elements-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#elements-form"}},[t._v("#")]),t._v(" Elements form "),a("Badge",{attrs:{text:"arrays"}})],1),t._v(" "),a("p",[t._v("This form defines a homogenous array of any size (possibly empty) with the elements that satisfy a given schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("elements")]),t._v(" (schema that elements should satisfy) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, the data instance must be JSON array (without using additional "),a("code",[t._v("type")]),t._v(" keyword), and there is no way to enforce the restrictions that cannot be present on type level of most languages, such as array size and uniqueness of items.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("elements")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('["foo"]')]),t._v(", "),a("code",[t._v('["foo", "bar"]')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v('["foo", 1]')]),t._v(", any type other than array")]),t._v(" "),a("h3",{attrs:{id:"properties-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties-form"}},[t._v("#")]),t._v(" Properties form "),a("Badge",{attrs:{text:"objects"}})],1),t._v(" "),a("p",[t._v("This form defines record (JSON object) that has defined required and optional properties.")]),t._v(" "),a("p",[t._v("It is required that this form has either "),a("code",[t._v("properties")]),t._v(" member, or "),a("code",[t._v("optionalProperties")]),t._v(", or both, in which case the cannot have overlapping properties. Additional properties can be allowed by adding an optional boolean member "),a("code",[t._v("additionalProperties")]),t._v(" with a value "),a("code",[t._v("true")]),t._v(". This form, as all other, can have optional "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(" members.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, all properties defined in "),a("code",[t._v("properties")]),t._v(" schema member are required, the data instance must be JSON object (without using additional "),a("code",[t._v("type")]),t._v(" keyword) and by default additional properties are not allowed (with the exception of discriminator tag - see the next section). This strictness minimises user mistakes.")]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{foo: "bar"}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "bar", bar: 1}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 2.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{foo: "bar"}')]),t._v(", "),a("code",[t._v('{foo: "bar", bar: "1"}')]),t._v(", "),a("code",[t._v('{foo: "bar", additional: 1}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "bar", bar: "3"}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 3: invalid schema (overlapping required and optional properties)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"discriminator-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#discriminator-form"}},[t._v("#")]),t._v(" Discriminator form "),a("Badge",{attrs:{text:"tagged union"}})],1),t._v(" "),a("p",[t._v("This form defines discriminated (tagged) union of different record types.")]),t._v(" "),a("p",[t._v("It has required members "),a("code",[t._v("discriminator")]),t._v(" and "),a("code",[t._v("mapping")]),t._v(" and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("The string value of "),a("code",[t._v("discriminator")]),t._v(" schema member contains the name of the data member that is the tag of the union. "),a("code",[t._v("mapping")]),t._v(" schema member contains the dictionary of schemas that are applied according to the value of the tag member in the data. Schemas inside "),a("code",[t._v("mapping")]),t._v(' must have "properties" form.')]),t._v(" "),a("p",[t._v("Properties forms inside "),a("code",[t._v("mapping")]),t._v(" cannot be "),a("code",[t._v("nullable")]),t._v(" and cannot define the same property as discriminator tag.")]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mapping")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v('{version: "1", foo: "1"}')]),t._v(", "),a("code",[t._v('{version: "2", foo: 1}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "1"}')]),t._v(", "),a("code",[t._v('{version: 1, foo: "1"}')]),t._v(", any type other than object")]),t._v(" "),a("p",[a("strong",[t._v("Example 3: invalid schema (discriminator tag member defined in mapping)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("discriminator")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mapping")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("version")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("version")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"values-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#values-form"}},[t._v("#")]),t._v(" Values form "),a("Badge",{attrs:{text:"dictionary"}})],1),t._v(" "),a("p",[t._v("This form defines a homogenous dictionary where the values of members satisfy a given schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("values")]),t._v(" (schema that member values should satisfy) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, the data instance must be JSON object (without using additional "),a("code",[t._v("type")]),t._v(" keyword), and there is no way to enforce size restrictions.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[t._v("Schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("values")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"uint8"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Valid data: "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{"foo": 1}')]),t._v(", "),a("code",[t._v('{"foo": 1, "bar": 2}')])]),t._v(" "),a("p",[t._v("Invalid data: "),a("code",[t._v('{"foo": "bar"}')]),t._v(", any type other than object")]),t._v(" "),a("h3",{attrs:{id:"ref-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ref-form"}},[t._v("#")]),t._v(" Ref form "),a("Badge",{attrs:{text:"reference definitions"}})],1),t._v(" "),a("p",[t._v("This form defines a reference to the schema that is present in the corresponding key in the "),a("code",[t._v("definitions")]),t._v(" member of the root schema.")]),t._v(" "),a("p",[t._v("It has a required member "),a("code",[t._v("ref")]),t._v(" (member of "),a("code",[t._v("definitions")]),t._v(" object in the root schema) and optional members "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(", no other members are allowed.")]),t._v(" "),a("p",[t._v("Unlike JSON Schema, JTD does not allow to reference:")]),t._v(" "),a("ul",[a("li",[t._v("any schema fragment other than root level "),a("code",[t._v("definitions")]),t._v(" member")]),t._v(" "),a("li",[t._v("root of the schema - there is another way to define a self-recursive schema (see Example 2)")]),t._v(" "),a("li",[t._v("another schema file (but you can still combine schemas from multiple files using JavaScript).")])]),t._v(" "),a("p",[a("strong",[t._v("Example 1.")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("propFoo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("nullable")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Example 2: self-referencing schema for binary tree")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("tree")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("optionalProperties")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("left")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("right")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"tree"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Example 3: invalid schema (missing reference)")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ref")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("definitions")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"empty-form"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#empty-form"}},[t._v("#")]),t._v(" Empty form "),a("Badge",{attrs:{text:"any data"}})],1),t._v(" "),a("p",[t._v("Empty JTD schema defines the data instance that can be of any type, including JSON "),a("code",[t._v("null")]),t._v(" (even if "),a("code",[t._v("nullable")]),t._v(" member is not present). It cannot have any member other than "),a("code",[t._v("nullable")]),t._v(" and "),a("code",[t._v("metadata")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"jtdschematype"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jtdschematype"}},[t._v("#")]),t._v(" JTDSchemaType")]),t._v(" "),a("p",[t._v("The type "),a("code",[t._v("JTDSchemaType")]),t._v(" can be used to validate that the written schema matches the type you expect to validate. This type is strict such that if typescript compiles, you should require no further type guards. The downside of this is that the types that "),a("code",[t._v("JTDSchemaType")]),t._v(" can verify are limited to the types that JTD can verify. If a type doesn't verify, "),a("code",[t._v("JTDSchemaType")]),t._v(" should resolve to "),a("code",[t._v("never")]),t._v(", throwing an error when you try to assign to it. This means that types like "),a("code",[t._v("1 | 2 | 3")]),t._v(", or general untagged unions (outside of unions of string literals) cannot be used with "),a("code",[t._v("JTDSchemaType")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"most-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#most-schemas"}},[t._v("#")]),t._v(" Most Schemas")]),t._v(" "),a("p",[t._v("Most straightforward types should work with "),a("code",[t._v("JTDSchemaType")]),t._v(", e.g.")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyType")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v("\n optionalStr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v("\n nullableEnum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.0"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.2"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v("\n values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Record"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n nullableEnum"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("enum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.0"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v1.2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nullable"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("values"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"int32"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n optionalStr"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("will compile. Using "),a("code",[t._v("schema")]),t._v(" with AJV will guarantee type safety.")]),t._v(" "),a("h3",{attrs:{id:"ref-schemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ref-schemas"}},[t._v("#")]),t._v(" Ref Schemas")]),t._v(" "),a("p",[t._v("Ref schemas are a little more advanced, because the types of every definition must be specified in advance.\nA simple ref schema is relatively straightforward:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n definitions"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n num"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"num"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("note that the type of all definitions was included as a second argument to "),a("code",[t._v("JTDSchemaType")]),t._v(".")]),t._v(" "),a("p",[t._v("This also works for recursive schemas:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("LinkedList")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" next"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("node"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" LinkedList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n definitions"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n node"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n properties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n val"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"float64"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n optionalProperties"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n next"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"node"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n ref"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"node"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h3",{attrs:{id:"notable-omissions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notable-omissions"}},[t._v("#")]),t._v(" Notable Omissions")]),t._v(" "),a("p",[a("code",[t._v("JTDSchemaType")]),t._v(" currently validates that if the schema compiles it will verify an accurate type, but there are a few places with potentially unexpected behavior.\n"),a("code",[t._v("JTDSchemaType")]),t._v(" doesn't verify the schema is correct. It won't reject schemas that definitions anywhere by the root, and it won't reject discriminator schemas that still define the descriminator in mapping properties. It also won't verify that enum schemas have every enum member as this isn't generally feasible in typescript yet.")]),t._v(" "),a("h2",{attrs:{id:"extending-jtd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#extending-jtd"}},[t._v("#")]),t._v(" Extending JTD")]),t._v(" "),a("h3",{attrs:{id:"metadata-schema-member"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#metadata-schema-member"}},[t._v("#")]),t._v(" Metadata schema member")]),t._v(" "),a("p",[t._v("Each schema form may have an optional member "),a("code",[t._v("metadata")]),t._v(" that JTD reserves for implementation/application specific extensions. Ajv uses this member as a location where any non-standard keywords can be used, such as:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("union")]),t._v(" keyword included in Ajv")]),t._v(" "),a("li",[t._v("any user-defined keywords, for example keywords defined in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),a("OutboundLink")],1),t._v(" package")]),t._v(" "),a("li",[t._v("JSON Schema keywords, as long as their names are different from standard JTD keywords. It can be used to enable a gradual migration from JSON Schema to JTD, should it be required.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Extensions are non-portable")]),t._v(" "),a("p",[t._v("Ajv-specific extension to JTD are likely to be unsupported by other tools, so while it may simplify adoption, it undermines the cross-platform objective of using JTD. While it is ok to put some human readable information in "),a("code",[t._v("metadata")]),t._v(" member, it is recommended not to add any validation logic there (even if it is supported by Ajv).")])]),t._v(" "),a("p",[t._v("Additional restrictions that Ajv enforces on "),a("code",[t._v("metadata")]),t._v(" schema member:")]),t._v(" "),a("ul",[a("li",[t._v("you cannot use standard JTD keywords there. While strictly speaking it is allowed by the specification, these keywords should be ignored inside "),a("code",[t._v("metadata")]),t._v(" - the general approach of Ajv is to avoid anything that is ignored.")]),t._v(" "),a("li",[t._v("you need to define all members used in "),a("code",[t._v("metadata")]),t._v(" as keywords. If they are no-op it can be done with "),a("code",[t._v('ajv.addKeyword("my-metadata-keyword")')]),t._v(". This restriction can be removed by disabling "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/docs/strict-mode.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("strict mode"),a("OutboundLink")],1),t._v(", without affecting the strictness of JTD - unknown keywords would still be prohibited in the schema itself.")])]),t._v(" "),a("h3",{attrs:{id:"union-keyword"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#union-keyword"}},[t._v("#")]),t._v(" Union keyword")]),t._v(" "),a("p",[t._v("Ajv defines "),a("code",[t._v("union")]),t._v(" keyword that is used in the schema that validates JTD schemas ("),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/refs/jtd-schema.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("meta-schema"),a("OutboundLink")],1),t._v(").")]),t._v(" "),a("p",[t._v("This keyword can be used only inside "),a("code",[t._v("metadata")]),t._v(" schema member.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Union keyword is non-portable")]),t._v(" "),a("p",[t._v("This keyword is non-standard and it is not supported in other JTD tools, so it is recommended NOT to use this keyword in schemas for your data if you want them to be cross-platform.")])]),t._v(" "),a("h3",{attrs:{id:"user-defined-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-keywords"}},[t._v("#")]),t._v(" User-defined keywords")]),t._v(" "),a("p",[t._v("Any user-defined keywords that can be used in JSON Schema schemas can also be used in JTD schemas, including the keywords in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-keywords"),a("OutboundLink")],1),t._v(" package.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("User-defined keywords are non-portable")]),t._v(" "),a("p",[t._v("It is strongly recommended to only use it to simplify migration from JSON Schema to JTD and not to use non-standard keywords in the new schemas, as these keywords are not supported by any other tools.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Parsing does NOT support non-standard JTD keywords")]),t._v(" "),a("p",[t._v("compileParser method does not support non-standard JTD keywords, you will have to use JSON.parse and then validates.")])]),t._v(" "),a("h2",{attrs:{id:"validation-errors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#validation-errors"}},[t._v("#")]),t._v(" Validation errors")]),t._v(" "),a("p",[t._v("TODO")])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/64.13ccbf28.js b/assets/js/64.13ccbf28.js new file mode 100644 index 000000000..524223c07 --- /dev/null +++ b/assets/js/64.13ccbf28.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{411:function(t,a,s){"use strict";s.r(a);var n=s(14),e=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"user-defined-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-keywords"}},[t._v("#")]),t._v(" User defined keywords")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#common-attributes-of-keyword-definitions"}},[t._v("Common attributes of keyword definitions")]),a("ul",[a("li",[a("a",{attrs:{href:"#define-keyword-with-code-generation-function"}},[t._v("Define keyword with code generation function "),a("Badge",{attrs:{text:"recommended"}})],1)]),a("li",[a("a",{attrs:{href:"#define-keyword-with-validate-function"}},[t._v('Define keyword with "validate" function')])]),a("li",[a("a",{attrs:{href:"#define-keyword-with-compile-function"}},[t._v('Define keyword with "compile" function')])]),a("li",[a("a",{attrs:{href:"#define-keyword-with-macro-function"}},[t._v('Define keyword with "macro" function')])])])]),a("li",[a("a",{attrs:{href:"#schema-compilation-context"}},[t._v("Schema compilation context")])]),a("li",[a("a",{attrs:{href:"#validation-time-variables"}},[t._v("Validation time variables")])]),a("li",[a("a",{attrs:{href:"#reporting-errors"}},[t._v("Reporting errors")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"common-attributes-of-keyword-definitions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#common-attributes-of-keyword-definitions"}},[t._v("#")]),t._v(" Common attributes of keyword definitions")]),t._v(" "),a("p",[t._v("The usual interface to define all keywords has these properties:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("_KeywordDef")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n keyword"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JSONType "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" JSONType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data type(s) that keyword applies to,")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// if defined, it is usually "string", "number", "object" or "array"')]),t._v("\n schemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JSONType "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" JSONType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the allowed type(s) of value that keyword must have in the schema")]),t._v("\n error"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n message"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" Code"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n params"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" Code\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Keyword definitions may have additional optional properties - see "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/types/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("types"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("KeywordCxt"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"define-keyword-with-code-generation-function"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#define-keyword-with-code-generation-function"}},[t._v("#")]),t._v(" Define keyword with code generation function "),a("Badge",{attrs:{text:"recommended"}})],1),t._v(" "),a("p",[t._v("Starting from v7 Ajv uses "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/codegen/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("CodeGen module"),a("OutboundLink")],1),t._v(" for all pre-defined keywords - see "),a("RouterLink",{attrs:{to:"/codegen.html"}},[t._v("codegen.md")]),t._v(" for details.")],1),t._v(" "),a("p",[t._v("This is the best approach for user defined keywords:")]),t._v(" "),a("ul",[a("li",[t._v("safe against code injection")]),t._v(" "),a("li",[t._v("best performance")]),t._v(" "),a("li",[t._v("the precise control over validation process")]),t._v(" "),a("li",[t._v("access to the parent data and the path to the currently validated data")])]),t._v(" "),a("p",[t._v("While Ajv can be safely used with plain JavaScript, it is strongly recommended to use Typescript for user-defined keywords that generate code - the prevention against code injection via untrusted schemas is partially based on the type system, not only on runtime checks.")]),t._v(" "),a("p",[t._v('The usual keyword definition for keywords generating code extends common interface with "code" function:')]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CodeKeywordDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("_KeywordDef")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("code")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" ruleType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// code generation function")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Example "),a("code",[t._v("even")]),t._v(" keyword:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" from Ajv\n\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n keyword"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"even"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n schemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"boolean"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// $data: true // to support [$data reference](./guide/combining-schemas.md#data-reference), ...")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("code")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cxt\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" op "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("!==")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("===")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n cxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fail")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" %2 ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("op"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" 0")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ... the only code change needed is to use `cxt.fail$data` here")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("even"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("console")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("p",[t._v("Example "),a("code",[t._v("range")]),t._v(" keyword:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" nil"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" from Ajv\n\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n keyword"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"range"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("code")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" cxt\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("min"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" schema\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" eq"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Code "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exclusiveRange "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" _"),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" nil\n cxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fail")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("_"),a("span",{pre:!0,attrs:{class:"token template-string"}},[a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" <")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("eq"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("min"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" || ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" >")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("eq"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v(" ")]),a("span",{pre:!0,attrs:{class:"token interpolation"}},[a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("max"),a("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n metaSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n items"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("type"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n minItems"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n additionalItems"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("You can review pre-defined Ajv keywords in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/validation",target:"_blank",rel:"noopener noreferrer"}},[t._v("validation"),a("OutboundLink")],1),t._v(" folder for more advanced examples - it is much easier to define code generation keywords than it was in the previous version of Ajv.")]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("KeywordCxt"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("SchemaCxt"),a("OutboundLink")],1),t._v(" type definitions for more information about properties you can use in your keywords.")]),t._v(" "),a("h3",{attrs:{id:"define-keyword-with-validate-function"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#define-keyword-with-validate-function"}},[t._v("#")]),t._v(' Define keyword with "validate" function')]),t._v(" "),a("p",[t._v("Usual keyword definition for validation keywords:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FuncKeywordDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("_KeywordDef")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n validate"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SchemaValidateFunction "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" DataValidateFunction "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// DataValidateFunction requires `schema: false` option")]),t._v("\n schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// schema: false makes validate not to expect schema (DataValidateFunction)")]),t._v("\n modifying"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n async"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n valid"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n errors"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"full"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SchemaValidateFunction")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" AnySchemaObject"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataCxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" DataValidationCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n errors"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Partial"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ErrorObject"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DataValidateFunction")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataCxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" DataValidationCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Promise")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n errors"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Partial"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("ErrorObject"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("The function should return validation result as boolean. It can return an array of validation errors via "),a("code",[t._v(".errors")]),t._v(" property of itself (otherwise a standard error will be used).")]),t._v(" "),a("p",[a("code",[t._v("validate")]),t._v(" keywords are suitable for:")]),t._v(" "),a("ul",[a("li",[t._v("testing your keywords before converting them to compiled/code keywords")]),t._v(" "),a("li",[t._v("defining keywords that do not depend on the schema value (e.g., when the value is always "),a("code",[t._v("true")]),t._v("). In this case you can add option "),a("code",[t._v("schema: false")]),t._v(" to the keyword definition and the schemas won't be passed to the validation function, it will only receive the same parameters as compiled validation function.")]),t._v(" "),a("li",[t._v("defining keywords where the schema is a value used in some expression.")]),t._v(" "),a("li",[t._v("defining keywords that support "),a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v(" - in this case "),a("code",[t._v("validate")]),t._v(" or "),a("code",[t._v("code")]),t._v(" function is required, either as the only option or in addition to "),a("code",[t._v("compile")]),t._v(" or "),a("code",[t._v("macro")]),t._v(".")],1)]),t._v(" "),a("p",[t._v("Example: "),a("code",[t._v("constant")]),t._v(" keyword (a synonym for draft-06 keyword "),a("code",[t._v("const")]),t._v(", it is equivalent to "),a("code",[t._v("enum")]),t._v(" keyword with one item):")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keyword")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"constant"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("deepEqual")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errors")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("constant")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("constant")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"baz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("p",[a("code",[t._v("const")]),t._v(" keyword is already available in Ajv.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Keywords that do not define errors")]),t._v(" "),a("p",[t._v("If the keyword does not define errors (see "),a("RouterLink",{attrs:{to:"/api.html#reporting-errors"}},[t._v("Reporting errors")]),t._v(") pass "),a("code",[t._v("errors: false")]),t._v(" in its definition; it will make generated code more efficient.")],1)]),t._v(" "),a("p",[t._v("To add asynchronous keyword pass "),a("code",[t._v("async: true")]),t._v(" in its definition.")]),t._v(" "),a("h3",{attrs:{id:"define-keyword-with-compile-function"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#define-keyword-with-compile-function"}},[t._v("#")]),t._v(' Define keyword with "compile" function')]),t._v(" "),a("p",[t._v('The keyword is similar to "validate", with the difference that "compile" property has function that will be called during schema compilation and should return validation function:')]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FuncKeywordDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("_KeywordDef")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n compile"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" AnySchemaObject"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" it"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SchemaObjCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" DataValidateFunction\n schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// schema: false makes validate not to expect schema (DataValidateFunction)")]),t._v("\n modifying"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n async"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n valid"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v("\n errors"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("boolean")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"full"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("In some cases it is the best approach to define keywords, but it has the performance cost of an extra function call during validation. If keyword logic can be expressed via some other JSON Schema then "),a("code",[t._v("macro")]),t._v(" keyword definition is more efficient (see below).")]),t._v(" "),a("p",[t._v("Example. "),a("code",[t._v("range")]),t._v(" and "),a("code",[t._v("exclusiveRange")]),t._v(" keywords using compiled schema:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keyword")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"range"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("min"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" max"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("exclusiveRange "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("===")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" min "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("max")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" min "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" max\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errors")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("metaSchema")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// schema to validate keyword value")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"array"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("items")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalItems")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("range")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("exclusiveRange")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.01")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.99")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// true")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\n")])])]),a("p",[t._v("See note on errors and asynchronous keywords in the previous section.")]),t._v(" "),a("h3",{attrs:{id:"define-keyword-with-macro-function"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#define-keyword-with-macro-function"}},[t._v("#")]),t._v(' Define keyword with "macro" function')]),t._v(" "),a("p",[t._v("Keyword definition:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MacroKeywordDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("FuncKeywordDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("macro")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("any")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parentSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" AnySchemaObject"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" it"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" SchemaCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" AnySchema\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v('"Macro" function is called during schema compilation. It is passed schema, parent schema and '),a("a",{attrs:{href:"#schema-compilation-context"}},[t._v("schema compilation context")]),t._v(" and it should return another schema that will be applied to the data in addition to the original schema.")]),t._v(" "),a("p",[t._v("It is an efficient approach (in cases when the keyword logic can be expressed with another JSON Schema), because it is usually easy to implement and there is no extra function call during validation.")]),t._v(" "),a("p",[t._v("In addition to the errors from the expanded schema macro keyword will add its own error in case validation fails.")]),t._v(" "),a("p",[t._v("Example. "),a("code",[t._v("range")]),t._v(" and "),a("code",[t._v("exclusiveRange")]),t._v(" keywords from the previous example defined with macro:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addKeyword")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keyword")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"range"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("macro")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("minimum"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" maximum"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("minimum"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" maximum"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// schema with keywords minimum and maximum")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// metaSchema: the same as in the example above")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("Macro keywords can be recursive - i.e. return schemas containing the same keyword. See the example of defining a recursive macro keyword "),a("code",[t._v("deepProperties")]),t._v(" in the "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/keyword.spec.ts#L316",target:"_blank",rel:"noopener noreferrer"}},[t._v("test"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"schema-compilation-context"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#schema-compilation-context"}},[t._v("#")]),t._v(" Schema compilation context")]),t._v(" "),a("p",[t._v("Schema compilation context "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("SchemaCxt"),a("OutboundLink")],1),t._v(" is available in property "),a("code",[t._v("it")]),t._v(" of "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/validate/index.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("KeywordCxt"),a("OutboundLink")],1),t._v(" (and it is also the 3rd parameter of "),a("code",[t._v("compile")]),t._v(" and "),a("code",[t._v("macro")]),t._v(" keyword functions). See types in the source code on the properties you can use in this object.")]),t._v(" "),a("h2",{attrs:{id:"validation-time-variables"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#validation-time-variables"}},[t._v("#")]),t._v(" Validation time variables")]),t._v(" "),a("p",[t._v("All function scoped variables available during validation are defined in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/compile/names.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("names"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"reporting-errors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#reporting-errors"}},[t._v("#")]),t._v(" Reporting errors")]),t._v(" "),a("p",[t._v("All keywords can define error messages with "),a("code",[t._v("KeywordErrorDefinition")]),t._v(" object passed as "),a("code",[t._v("error")]),t._v(" property of keyword definition:")]),t._v(" "),a("div",{staticClass:"language-typescript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-typescript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("KeywordErrorDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n message"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("string")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordErrorCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" Code"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n params"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cxt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" KeywordErrorCxt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" Code\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("code",[t._v("code")]),t._v(" keywords can pass parameters to these functions via "),a("code",[t._v("cxt.setParams")]),t._v(" (see implementations of pre-defined keywords), other keywords can only set a string message this way.")]),t._v(" "),a("p",[t._v("Another approach for reporting errors can be used for "),a("code",[t._v("validate")]),t._v(" and "),a("code",[t._v("compile")]),t._v(" keyword - they can define errors by assigning them to "),a("code",[t._v(".errors")]),t._v(" property of the validation function. Asynchronous keywords can return promise that rejects with "),a("code",[t._v("new Ajv.ValidationError(errors)")]),t._v(", where "),a("code",[t._v("errors")]),t._v(" is an array of validation errors (if you don't want to create errors in asynchronous keyword, its validation function can return the promise that resolves with "),a("code",[t._v("false")]),t._v(").")]),t._v(" "),a("p",[t._v("Each error object in "),a("code",[t._v("errors")]),t._v(" array should at least have properties "),a("code",[t._v("keyword")]),t._v(", "),a("code",[t._v("message")]),t._v(" and "),a("code",[t._v("params")]),t._v(", other properties will be added.")]),t._v(" "),a("p",[t._v("If keyword doesn't define or return errors, the default error will be created in case the keyword fails validation.")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/65.7103f360.js b/assets/js/65.7103f360.js new file mode 100644 index 000000000..75a8c86e9 --- /dev/null +++ b/assets/js/65.7103f360.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{412:function(t,e,o){"use strict";o.r(e);var n=o(14),i=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("The MIT License (MIT)")]),t._v(" "),e("p",[t._v("Copyright (c) 2015-2021 Evgeny Poberezkin")]),t._v(" "),e("p",[t._v('Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:')]),t._v(" "),e("p",[t._v("The above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.")]),t._v(" "),e("p",[t._v('THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.')])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/67.ca98640c.js b/assets/js/67.ca98640c.js new file mode 100644 index 000000000..4669494dc --- /dev/null +++ b/assets/js/67.ca98640c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{415:function(e,t,a){"use strict";a.r(t);var s=a(14),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Ajv version 7 has these new features:")]),e._v(" "),t("ul",[t("li",[e._v("support of JSON Schema draft-2019-09 features: "),t("a",{attrs:{href:"/json-schema.html#keywords-for-objects"}},[e._v("unevaluatedProperties")]),e._v(" and "),t("a",{attrs:{href:"/json-schema.html#unevaluateditems"}},[e._v("unevaluatedItems")]),e._v(", "),t("a",{attrs:{href:"/guide/combining-schemas.html#extending-recursive-schemas"}},[e._v("dynamic recursive references")]),e._v(" and other "),t("a",{attrs:{href:"/json-schema.html#json-schema-draft-2019-09"}},[e._v("additional keywords")]),e._v(".")]),e._v(" "),t("li",[e._v("to reduce the mistakes in JSON schemas and unexpected validation results, "),t("a",{attrs:{href:"/strict-mode.html"}},[e._v("strict mode")]),e._v(" is added - it prohibits ignored or ambiguous JSON Schema elements.")]),e._v(" "),t("li",[e._v("to make code injection from untrusted schemas impossible, "),t("a",{attrs:{href:"/codegen.html"}},[e._v("code generation")]),e._v(" is fully re-written to be safe and to allow code optimization (compiled schema code size is reduced by more than 10%).\n")]),e._v(" "),t("li",[e._v("to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas. "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords",target:"_blank",rel:"noopener noreferrer"}},[e._v("ajv-keywords"),t("OutboundLink")],1),e._v(" package was updated to use the new API (in "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-keywords/releases/tag/v4.0.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("v4.0.0"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("schemas are compiled to ES6 code (ES5 code generation is also supported with an option).")]),e._v(" "),t("li",[e._v("to improve reliability and maintainability the code is migrated to TypeScript.")])]),e._v(" "),t("p",[t("strong",[e._v("Please note")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v('the support for JSON-Schema draft-04 is removed - if you have schemas using "id" attributes you have to replace them with "$id" (or continue using '),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/tree/v6",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ajv v6"),t("OutboundLink")],1),e._v(" that will be supported until 02/28/2021).")]),e._v(" "),t("li",[e._v("all formats are separated to ajv-formats package - they have to be explicitly added if you use them.")])]),e._v(" "),t("p",[e._v("See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/releases/tag/v7.0.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("release notes"),t("OutboundLink")],1),e._v(" for the details.")]),e._v(" "),t("p",[e._v("To install the new version:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("npm")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" ajv\n")])])]),t("p",[e._v("See "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(" for code examples.")],1)])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/72.5466396d.js b/assets/js/72.5466396d.js new file mode 100644 index 000000000..b705a02d7 --- /dev/null +++ b/assets/js/72.5466396d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{421:function(t,o,n){"use strict";n.r(o);var e=n(14),s=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("Ajv was awarded a sponsorship from "),t("a",{attrs:{href:"https://github.com/microsoft/foss-fund/blob/main/README.md#2021",target:"_blank",rel:"noopener noreferrer"}},[this._v("Microsoft FOSS fund"),t("OutboundLink")],1),this._v(" - huge thanks to Microsoft and the engineers who voted to support Ajv development.")]),this._v(" "),t("p",[this._v("This award will contribute to a long term maintenance of Ajv.")])])}),[],!1,null,null,null);o.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/77.bd290d20.js b/assets/js/77.bd290d20.js new file mode 100644 index 000000000..265e87857 --- /dev/null +++ b/assets/js/77.bd290d20.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{425:function(t,s,a){"use strict";a.r(s);var r=a(14),e=Object(r.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[s("a",{attrs:{href:"https://github.com/ajv-validator/ajv-errors",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-errors repository"),s("OutboundLink")],1)]),t._v(" "),s("h1",{attrs:{id:"ajv-errors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ajv-errors"}},[t._v("#")]),t._v(" ajv-errors")]),t._v(" "),s("p",[t._v("Custom error messages in JSON-Schema for Ajv validator")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/ajv-validator/ajv-errors/actions?query=workflow%3Abuild",target:"_blank",rel:"noopener noreferrer"}},[s("img",{attrs:{src:"https://github.com/ajv-validator/ajv-errors/workflows/build/badge.svg",alt:"build"}}),s("OutboundLink")],1),t._v(" "),s("a",{attrs:{href:"https://www.npmjs.com/package/ajv-errors",target:"_blank",rel:"noopener noreferrer"}},[s("img",{attrs:{src:"https://img.shields.io/npm/v/ajv-errors.svg",alt:"npm"}}),s("OutboundLink")],1),t._v(" "),s("a",{attrs:{href:"https://coveralls.io/github/ajv-validator/ajv-errors?branch=master",target:"_blank",rel:"noopener noreferrer"}},[s("img",{attrs:{src:"https://coveralls.io/repos/github/ajv-validator/ajv-errors/badge.svg?branch=master",alt:"coverage"}}),s("OutboundLink")],1),t._v(" "),s("a",{attrs:{href:"https://gitter.im/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[s("img",{attrs:{src:"https://img.shields.io/gitter/room/ajv-validator/ajv.svg",alt:"gitter"}}),s("OutboundLink")],1)]),t._v(" "),s("p",[s("strong",[t._v("Please note")])]),t._v(" "),s("p",[t._v("ajv-errors v3 supports "),s("a",{attrs:{href:"https://github.com/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv v8"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("If you are using ajv v6, you should use "),s("a",{attrs:{href:"https://github.com/ajv-validator/ajv-errors/tree/v1",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-errors v1"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"contents"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#contents"}},[t._v("#")]),t._v(" Contents")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"#install"}},[t._v("Install")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#usage"}},[t._v("Usage")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"#single-message"}},[t._v("Single message")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#messages-for-keywords"}},[t._v("Messages for keywords")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#messages-for-properties-and-items"}},[t._v("Messages for properties and items")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#default-message"}},[t._v("Default message")])])])]),t._v(" "),s("li",[s("a",{attrs:{href:"#templates"}},[t._v("Templates")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#options"}},[t._v("Options")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#supporters"}},[t._v("Supporters, Enterprise support, Security contact")])]),t._v(" "),s("li",[s("a",{attrs:{href:"#license"}},[t._v("License")])])]),t._v(" "),s("h2",{attrs:{id:"install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("npm install ajv-errors\n")])])]),s("h2",{attrs:{id:"usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),s("p",[t._v("Add the keyword "),s("code",[t._v("errorMessages")]),t._v(" to Ajv instance:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("default\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allErrors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Ajv option allErrors is required")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-errors"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/*, {singleError: true} */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("See "),s("a",{attrs:{href:"#options"}},[t._v("Options")]),t._v(" below.")]),t._v(" "),s("h3",{attrs:{id:"single-message"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#single-message"}},[t._v("#")]),t._v(" Single message")]),t._v(" "),s("p",[t._v("Replace all errors in the current schema and subschemas with a single message:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should be an object with an integer property foo only"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// processed errors")]),t._v("\n")])])]),s("p",[t._v("Processed errors:")]),t._v(" "),s("div",{staticClass:"language-json5 extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json5"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errorMessage"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should be an object with an integer property foo only"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("params")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("errors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"additionalProperties"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('".foo"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("h3",{attrs:{id:"messages-for-keywords"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#messages-for-keywords"}},[t._v("#")]),t._v(" Messages for keywords")]),t._v(" "),s("p",[t._v("Replace errors for certain keywords in the current schema only:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should be an object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// will not replace internal "type" error for the property "foo"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should have property foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should not have properties other than foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// processed errors")]),t._v("\n")])])]),s("p",[t._v("Processed errors:")]),t._v(" "),s("div",{staticClass:"language-json5 extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json5"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// original error")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" type"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should be integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// generated error")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errorMessage"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should not have properties other than foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("params")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("errors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"additionalProperties"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("p",[t._v('For keywords "required" and "dependencies" it is possible to specify different messages for different properties:')]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"should be an object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// will not replace internal "type" error for the property "foo"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'should have an integer property \"foo\"'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'should have a string property \"bar\"'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"messages-for-properties-and-items"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#messages-for-properties-and-items"}},[t._v("#")]),t._v(" Messages for properties and items")]),t._v(" "),s("p",[t._v("Replace errors for properties / items (and deeper), regardless where in schema they were created:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allOf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minLength")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.foo should be integer >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.bar should be string with length >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// processed errors")]),t._v("\n")])])]),s("p",[t._v("Processed errors:")]),t._v(" "),s("div",{staticClass:"language-json5 extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json5"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errorMessage"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.foo should be integer >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("params")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("errors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minimum"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errorMessage"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.bar should be string with length >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/bar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("params")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("errors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"minLength"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("h3",{attrs:{id:"default-message"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#default-message"}},[t._v("#")]),t._v(" Default message")]),t._v(" "),s("p",[t._v("When the value of keyword "),s("code",[t._v("errorMessage")]),t._v(" is an object you can specify a message that will be used if any error appears that is not specified by keywords/properties/items using "),s("code",[t._v("_")]),t._v(" property:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("required")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"foo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allOf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"integer"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minLength")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data should be an object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("foo")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.foo should be integer >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("bar")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"data.bar should be string with length >= 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("_")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'data should have properties "foo" and "bar" only\'')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// false")]),t._v("\nconsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// processed errors")]),t._v("\n")])])]),s("p",[t._v("Processed errors:")]),t._v(" "),s("div",{staticClass:"language-json5 extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json5"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"errorMessage"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("message")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'data should be an object with properties "foo" and "bar" only\'')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("instancePath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("params")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("errors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keyword")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"required"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("/* , ... */")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),s("p",[t._v("The message in property "),s("code",[t._v("_")]),t._v(" of "),s("code",[t._v("errorMessage")]),t._v(" replaces the same errors that would have been replaced if "),s("code",[t._v("errorMessage")]),t._v(" were a string.")]),t._v(" "),s("h2",{attrs:{id:"templates"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#templates"}},[t._v("#")]),t._v(" Templates")]),t._v(" "),s("p",[t._v("Custom error messages used in "),s("code",[t._v("errorMessage")]),t._v(" keyword can be templates using "),s("a",{attrs:{href:"https://tools.ietf.org/html/rfc6901",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON-pointers"),s("OutboundLink")],1),t._v(" or "),s("a",{attrs:{href:"http://tools.ietf.org/html/draft-luff-relative-json-pointer-00",target:"_blank",rel:"noopener noreferrer"}},[t._v("relative JSON-pointers"),s("OutboundLink")],1),t._v(" to data being validated, in which case the value will be interpolated. Also see "),s("a",{attrs:{href:"https://gist.github.com/geraintluff/5911303",target:"_blank",rel:"noopener noreferrer"}},[t._v("examples"),s("OutboundLink")],1),t._v(" of relative JSON-pointers.")]),t._v(" "),s("p",[t._v("The syntax to interpolate a value is "),s("code",[t._v("${}")]),t._v(".")]),t._v(" "),s("p",[t._v("The values used in messages will be JSON-stringified:")]),t._v(" "),s("ul",[s("li",[t._v("to differentiate between "),s("code",[t._v("false")]),t._v(" and "),s("code",[t._v('"false"')]),t._v(", etc.")]),t._v(" "),s("li",[t._v("to support structured values.")])]),t._v(" "),s("p",[t._v("Example:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("minimum")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"size should be a number bigger or equal to 4, current value is ${/size}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h4",{attrs:{id:"using-property-names-in-error-messages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-property-names-in-error-messages"}},[t._v("#")]),t._v(" Using property names in error messages")]),t._v(" "),s("p",[t._v("Property names can be used in error messages with the relative JSON-pointer (e.g. "),s("code",[t._v("0#")]),t._v(").")]),t._v(" "),s("p",[t._v("Example:")]),t._v(" "),s("div",{staticClass:"language-javascript extra-class"},[s("pre",{pre:!0,attrs:{class:"language-javascript"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"object"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("properties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("additionalProperties")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("not")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("errorMessage")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" “extra property is $"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("#"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("”\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"options"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#options"}},[t._v("#")]),t._v(" Options")]),t._v(" "),s("p",[t._v("Defaults:")]),t._v(" "),s("div",{staticClass:"language-json5 extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json5"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("keepErrors")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property unquoted"}},[t._v("singleError")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("ul",[s("li",[s("em",[t._v("keepErrors")]),t._v(": keep original errors. Default is to remove matched errors (they will still be available in "),s("code",[t._v("params.errors")]),t._v(" property of generated error). If an error was matched and included in the error generated by "),s("code",[t._v("errorMessage")]),t._v(" keyword it will have property "),s("code",[t._v("emUsed: true")]),t._v(".")]),t._v(" "),s("li",[s("em",[t._v("singleError")]),t._v(": create one error for all keywords used in "),s("code",[t._v("errorMessage")]),t._v(" keyword (error messages defined for properties and items are not merged because they have different instancePaths). Multiple error messages are concatenated. Option values:\n"),s("ul",[s("li",[s("code",[t._v("false")]),t._v(" (default): create multiple errors, one for each message")]),t._v(" "),s("li",[s("code",[t._v("true")]),t._v(": create single error, messages are concatenated using "),s("code",[t._v('"; "')])]),t._v(" "),s("li",[t._v("non-empty string: this string is used as a separator to concatenate messages")])])])]),t._v(" "),s("h2",{attrs:{id:"supporters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#supporters"}},[t._v("#")]),t._v(" Supporters")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://www.linkedin.com/in/rogerkepler/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Roger Kepler"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"enterprise-support"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enterprise-support"}},[t._v("#")]),t._v(" Enterprise support")]),t._v(" "),s("p",[t._v("ajv-errors package is a part of "),s("a",{attrs:{href:"https://tidelift.com/subscription/pkg/npm-ajv-errors?utm_source=npm-ajv-errors&utm_medium=referral&utm_campaign=enterprise&utm_term=repo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tidelift enterprise subscription"),s("OutboundLink")],1),t._v(" - it provides a centralised commercial support to open-source software users, in addition to the support provided by software maintainers.")]),t._v(" "),s("h2",{attrs:{id:"security-contact"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#security-contact"}},[t._v("#")]),t._v(" Security contact")]),t._v(" "),s("p",[t._v("To report a security vulnerability, please use the\n"),s("a",{attrs:{href:"https://tidelift.com/security",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tidelift security contact"),s("OutboundLink")],1),t._v(".\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerability via GitHub issues.")]),t._v(" "),s("h2",{attrs:{id:"license"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[t._v("#")]),t._v(" License")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/epoberezkin/ajv-errors/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("MIT"),s("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/78.54ff67c4.js b/assets/js/78.54ff67c4.js new file mode 100644 index 000000000..f6aee23dd --- /dev/null +++ b/assets/js/78.54ff67c4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{426:function(t,a,e){"use strict";e.r(a);var s=e(14),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats repository"),a("OutboundLink")],1)]),t._v(" "),a("h1",{attrs:{id:"ajv-formats"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-formats"}},[t._v("#")]),t._v(" ajv-formats")]),t._v(" "),a("p",[t._v("JSON Schema formats for Ajv")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://travis-ci.org/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"https://travis-ci.org/ajv-validator/ajv-formats.svg?branch=master",alt:"Build Status"}}),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:"https://www.npmjs.com/package/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"https://img.shields.io/npm/v/ajv-formats.svg",alt:"npm"}}),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:"https://gitter.im/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"https://img.shields.io/gitter/room/ajv-validator/ajv.svg",alt:"Gitter"}}),a("OutboundLink")],1),t._v(" "),a("a",{attrs:{href:"https://github.com/sponsors/epoberezkin",target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:"https://img.shields.io/badge/$-sponsors-brightgreen",alt:"GitHub Sponsors"}}),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ESM/TypeScript import")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" addFormats "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-formats"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Node.js require:")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" addFormats "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-formats"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFormats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"formats"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#formats"}},[t._v("#")]),t._v(" Formats")]),t._v(" "),a("p",[t._v("The package defines these formats:")]),t._v(" "),a("ul",[a("li",[a("em",[t._v("date")]),t._v(": full-date according to "),a("a",{attrs:{href:"http://tools.ietf.org/html/rfc3339#section-5.6",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC3339"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("time")]),t._v(": time (time-zone is mandatory).")]),t._v(" "),a("li",[a("em",[t._v("date-time")]),t._v(": date-time (time-zone is mandatory).")]),t._v(" "),a("li",[a("em",[t._v("iso-time")]),t._v(": time with optional time-zone.")]),t._v(" "),a("li",[a("em",[t._v("iso-date-time")]),t._v(": date-time with optional time-zone.")]),t._v(" "),a("li",[a("em",[t._v("duration")]),t._v(": duration from "),a("a",{attrs:{href:"https://tools.ietf.org/html/rfc3339#appendix-A",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC3339"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("uri")]),t._v(": full URI.")]),t._v(" "),a("li",[a("em",[t._v("uri-reference")]),t._v(": URI reference, including full and relative URIs.")]),t._v(" "),a("li",[a("em",[t._v("uri-template")]),t._v(": URI template according to "),a("a",{attrs:{href:"https://tools.ietf.org/html/rfc6570",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6570"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("url")]),t._v(" (deprecated): "),a("a",{attrs:{href:"https://url.spec.whatwg.org/#concept-url",target:"_blank",rel:"noopener noreferrer"}},[t._v("URL record"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("email")]),t._v(": email address.")]),t._v(" "),a("li",[a("em",[t._v("hostname")]),t._v(": host name according to "),a("a",{attrs:{href:"http://tools.ietf.org/html/rfc1034#section-3.5",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC1034"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("ipv4")]),t._v(": IP address v4.")]),t._v(" "),a("li",[a("em",[t._v("ipv6")]),t._v(": IP address v6.")]),t._v(" "),a("li",[a("em",[t._v("regex")]),t._v(": tests whether a string is a valid regular expression by passing it to RegExp constructor.")]),t._v(" "),a("li",[a("em",[t._v("uuid")]),t._v(": Universally Unique IDentifier according to "),a("a",{attrs:{href:"http://tools.ietf.org/html/rfc4122",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC4122"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("json-pointer")]),t._v(": JSON-pointer according to "),a("a",{attrs:{href:"https://tools.ietf.org/html/rfc6901",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC6901"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("relative-json-pointer")]),t._v(": relative JSON-pointer according to "),a("a",{attrs:{href:"http://tools.ietf.org/html/draft-luff-relative-json-pointer-00",target:"_blank",rel:"noopener noreferrer"}},[t._v("this draft"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("li",[a("em",[t._v("byte")]),t._v(": base64 encoded data according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("int32")]),t._v(": signed 32 bits integer according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("int64")]),t._v(": signed 64 bits according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("float")]),t._v(": float according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("double")]),t._v(": double according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("password")]),t._v(": password string according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("em",[t._v("binary")]),t._v(": binary string according to the "),a("a",{attrs:{href:"https://spec.openapis.org/oas/v3.0.0#data-types",target:"_blank",rel:"noopener noreferrer"}},[t._v("openApi 3.0.0 specification"),a("OutboundLink")],1)])]),t._v(" "),a("p",[t._v("See regular expressions used for format validation and the sources that were used in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats/blob/master/src/formats.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("formats.ts"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("strong",[t._v("Please note")]),t._v(": JSON Schema draft-07 also defines formats "),a("code",[t._v("iri")]),t._v(", "),a("code",[t._v("iri-reference")]),t._v(", "),a("code",[t._v("idn-hostname")]),t._v(" and "),a("code",[t._v("idn-email")]),t._v(" for URLs, hostnames and emails with international characters. These formats are available in "),a("a",{attrs:{href:"https://github.com/luzlab/ajv-formats-draft2019",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats-draft2019"),a("OutboundLink")],1),t._v(" plugin.")]),t._v(" "),a("h2",{attrs:{id:"keywords-to-compare-values-formatmaximum-formatminimum-and-formatexclusivemaximum-formatexclusiveminimum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-to-compare-values-formatmaximum-formatminimum-and-formatexclusivemaximum-formatexclusiveminimum"}},[t._v("#")]),t._v(" Keywords to compare values: "),a("code",[t._v("formatMaximum")]),t._v(" / "),a("code",[t._v("formatMinimum")]),t._v(" and "),a("code",[t._v("formatExclusiveMaximum")]),t._v(" / "),a("code",[t._v("formatExclusiveMinimum")])]),t._v(" "),a("p",[t._v("These keywords allow to define minimum/maximum constraints when the format keyword defines ordering ("),a("code",[t._v("compare")]),t._v(" function in format definition).")]),t._v(" "),a("p",[t._v("These keywords are added to ajv instance when ajv-formats is used without options or with option "),a("code",[t._v("keywords: true")]),t._v(".")]),t._v(" "),a("p",[t._v("These keywords apply only to strings. If the data is not a string, the validation succeeds.")]),t._v(" "),a("p",[t._v("The value of keywords "),a("code",[t._v("formatMaximum")]),t._v("/"),a("code",[t._v("formatMinimum")]),t._v(" and "),a("code",[t._v("formatExclusiveMaximum")]),t._v("/"),a("code",[t._v("formatExclusiveMinimum")]),t._v(" should be a string or "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/docs/validation.md#data-reference",target:"_blank",rel:"noopener noreferrer"}},[t._v("$data reference"),a("OutboundLink")],1),t._v(". This value is the maximum (minimum) allowed value for the data to be valid as determined by "),a("code",[t._v("format")]),t._v(" keyword. If "),a("code",[t._v("format")]),t._v(" keyword is not present schema compilation will throw exception.")]),t._v(" "),a("p",[t._v("When these keyword are added, they also add comparison functions to formats "),a("code",[t._v('"date"')]),t._v(", "),a("code",[t._v('"time"')]),t._v(" and "),a("code",[t._v('"date-time"')]),t._v(". User-defined formats also can have comparison functions. See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/docs/api.md#api-addformat",target:"_blank",rel:"noopener noreferrer"}},[t._v("addFormat"),a("OutboundLink")],1),t._v(" method.")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-formats"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" schema "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("format")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"date"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("formatMinimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-02-06"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("formatExclusiveMaximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-12-27"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validDataList "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-02-06"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-12-26"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invalidDataList "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-02-05"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2016-12-27"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abc"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])]),a("h2",{attrs:{id:"options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#options"}},[t._v("#")]),t._v(" Options")]),t._v(" "),a("p",[t._v("Options can be passed via the second parameter. Options value can be")]),t._v(" "),a("ol",[a("li",[t._v("The list of format names that will be added to ajv instance:")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFormats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"date"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Please note")]),t._v(": when ajv encounters an undefined format it throws exception (unless ajv instance was configured with "),a("code",[t._v("strict: false")]),t._v(" option). To allow specific undefined formats they have to be passed to ajv instance via "),a("code",[t._v("formats")]),t._v(" option with "),a("code",[t._v("true")]),t._v(" value:")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Ajv")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("formats"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("date")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("time")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// to ignore "date" and "time" formats in schemas.')]),t._v("\n")])])]),a("ol",{attrs:{start:"2"}},[a("li",[t._v("Format validation mode (default is "),a("code",[t._v('"full"')]),t._v(") with optional list of format names and "),a("code",[t._v("keywords")]),t._v(" option to add additional format comparison keywords:")])]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFormats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fast"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("or")]),t._v(" "),a("div",{staticClass:"language-javascript extra-class"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addFormats")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("mode")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"fast"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("formats")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"date"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"time"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("keywords")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("In "),a("code",[t._v('"fast"')]),t._v(" mode the following formats are simplified: "),a("code",[t._v('"date"')]),t._v(", "),a("code",[t._v('"time"')]),t._v(", "),a("code",[t._v('"date-time"')]),t._v(", "),a("code",[t._v('"iso-time"')]),t._v(", "),a("code",[t._v('"iso-date-time"')]),t._v(", "),a("code",[t._v('"uri"')]),t._v(", "),a("code",[t._v('"uri-reference"')]),t._v(", "),a("code",[t._v('"email"')]),t._v(". For example, "),a("code",[t._v('"date"')]),t._v(", "),a("code",[t._v('"time"')]),t._v(" and "),a("code",[t._v('"date-time"')]),t._v(" do not validate ranges in "),a("code",[t._v('"fast"')]),t._v(" mode, only string structure, and other formats have simplified regular expressions.")]),t._v(" "),a("h2",{attrs:{id:"tests"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tests"}},[t._v("#")]),t._v(" Tests")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" submodule update "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--init")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v("\n")])])]),a("h2",{attrs:{id:"license"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[t._v("#")]),t._v(" License")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("MIT"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/79.f3b15312.js b/assets/js/79.f3b15312.js new file mode 100644 index 000000000..6cca5ce7c --- /dev/null +++ b/assets/js/79.f3b15312.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{429:function(t,e,a){"use strict";a.r(e);var r=a(14),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-i18n repository"),e("OutboundLink")],1)]),t._v(" "),e("h1",{attrs:{id:"ajv-i18n"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ajv-i18n"}},[t._v("#")]),t._v(" ajv-i18n")]),t._v(" "),e("p",[t._v("Internationalised error messages for "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ajv"),e("OutboundLink")],1),t._v(" - superfast JSON validator for JSON Schema and JSON Type Definition.")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://travis-ci.org/ajv-validator/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://travis-ci.org/ajv-validator/ajv-i18n.svg?branch=master",alt:"Build Status"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://www.npmjs.com/package/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://img.shields.io/npm/v/ajv-i18n.svg",alt:"npm"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://coveralls.io/github/ajv-validator/ajv-i18n?branch=master",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://coveralls.io/repos/github/ajv-validator/ajv-i18n/badge.svg?branch=master",alt:"Coverage Status"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://gitter.im/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://img.shields.io/gitter/room/ajv-validator/ajv.svg",alt:"Gitter"}}),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"supported-locales"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-locales"}},[t._v("#")]),t._v(" Supported locales")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("locale")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("language")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("contributor")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("draft-04")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("draft-06"),e("sup",[t._v("1")])]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("draft-07"),e("sup",[t._v("2")])]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("draft"),e("br"),t._v("2019-09"),e("sup",[t._v("3")]),e("br"),t._v("/2020-12"),e("sup",[t._v("4")])]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("JTD"),e("sup",[t._v("5")])])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("🇬🇧 en")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("English")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}}),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("AR ar")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Arabic")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/Mahmoud-Mardeni",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mahmoud-Mardeni"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")])]),t._v(" "),e("tr",[e("td",[t._v("CA ca")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Catalan")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/alexandreec",target:"_blank",rel:"noopener noreferrer"}},[t._v("alexandreec"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇨🇿 cs")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Czech")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/kiskovacs",target:"_blank",rel:"noopener noreferrer"}},[t._v("kiskovacs"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/NAM0007",target:"_blank",rel:"noopener noreferrer"}},[t._v("NAM0007"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇩🇪 de")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("German")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/jmtoball",target:"_blank",rel:"noopener noreferrer"}},[t._v("jmtoball"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/gflohr",target:"_blank",rel:"noopener noreferrer"}},[t._v("gflohr"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")])]),t._v(" "),e("tr",[e("td",[t._v("🇪🇸 es")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Spanish")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/jpablom",target:"_blank",rel:"noopener noreferrer"}},[t._v("jpablom"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇫🇮 fi")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Finnish")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/saulipurhonen",target:"_blank",rel:"noopener noreferrer"}},[t._v("saulipurhonen"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇫🇷 fr")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("French")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/monlouisj",target:"_blank",rel:"noopener noreferrer"}},[t._v("monlouisj"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/Telokis",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telokis"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇭🇺 hu")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Hungarian")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/szilveszter9",target:"_blank",rel:"noopener noreferrer"}},[t._v("szilveszter9"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇮🇩 id")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Indonesian")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/ekoeryanto",target:"_blank",rel:"noopener noreferrer"}},[t._v("ekoeryanto"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇮🇹 it")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Italian")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/jasoniangreen",target:"_blank",rel:"noopener noreferrer"}},[t._v("jasoniangreen"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/lucacorti",target:"_blank",rel:"noopener noreferrer"}},[t._v("lucacorti"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇯🇵 ja")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Japanese")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/gilgongo",target:"_blank",rel:"noopener noreferrer"}},[t._v("gilgongo"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇰🇷 ko")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Korean")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/MinByeongDon",target:"_blank",rel:"noopener noreferrer"}},[t._v("MinByeongDon"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇳🇴 nb")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Norwegian bokmål")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/mtramm",target:"_blank",rel:"noopener noreferrer"}},[t._v("mtramm"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇳🇱 nl")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Dutch")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/pimlie",target:"_blank",rel:"noopener noreferrer"}},[t._v("pimlie"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/niekvb",target:"_blank",rel:"noopener noreferrer"}},[t._v("niekvb"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇵🇱 pl")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Polish")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/danielzurawski",target:"_blank",rel:"noopener noreferrer"}},[t._v("danielzurawski"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇧🇷 pt-BR")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Português - Brasil")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/marcosrava",target:"_blank",rel:"noopener noreferrer"}},[t._v("marcosrava"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/ggondim",target:"_blank",rel:"noopener noreferrer"}},[t._v("ggondim"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇷🇺 ru")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Russian")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}}),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇸🇰 sk")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Slovak")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/kiskovacs",target:"_blank",rel:"noopener noreferrer"}},[t._v("kiskovacs"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇸🇪 sv")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Swedish")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/Limmen",target:"_blank",rel:"noopener noreferrer"}},[t._v("limmen"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("-")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("*")])]),t._v(" "),e("tr",[e("td",[t._v("🇹🇭 th")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Thai")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/encX",target:"_blank",rel:"noopener noreferrer"}},[t._v("encX"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇨🇳 zh")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Chinese")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/jinzhubaofu",target:"_blank",rel:"noopener noreferrer"}},[t._v("jinzhubaofu"),e("OutboundLink")],1),e("br"),e("a",{attrs:{href:"https://github.com/leuction",target:"_blank",rel:"noopener noreferrer"}},[t._v("leuction"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓"),e("br")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("br"),t._v("✓")])]),t._v(" "),e("tr",[e("td",[t._v("🇹🇼 zh-TW")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Chinese - Taiwan")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("a",{attrs:{href:"https://github.com/minipai",target:"_blank",rel:"noopener noreferrer"}},[t._v("minipai"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("✓")])])])]),t._v(" "),e("p",[e("sup",[t._v("1")]),t._v(" added boolean schema, keywords "),e("code",[t._v("const")]),t._v(", "),e("code",[t._v("contains")]),t._v(", "),e("code",[t._v("propertyNames")])]),t._v(" "),e("p",[e("sup",[t._v("2")]),t._v(" added keywords "),e("code",[t._v("if")]),t._v("/"),e("code",[t._v("then")]),t._v("/"),e("code",[t._v("else")])]),t._v(" "),e("p",[e("sup",[t._v("3")]),t._v(" added messages for keywords "),e("code",[t._v("unevaluatedProperties")]),t._v(", "),e("code",[t._v("unevaluatedItems")]),t._v(", "),e("code",[t._v("dependentRequired")])]),t._v(" "),e("p",[e("sup",[t._v("4")]),t._v(" keyword "),e("code",[t._v("items")]),t._v(" messages")]),t._v(" "),e("p",[e("sup",[t._v("5")]),t._v(" JSON Type Definition")]),t._v(" "),e("p",[t._v("* "),e("code",[t._v("discriminator")]),t._v(" form messages are not translated")]),t._v(" "),e("p",[t._v("Please contribute locales that you need to use if they are missing or incomplete.")]),t._v(" "),e("h2",{attrs:{id:"install"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),e("p",[t._v("Using npm:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("npm install ajv-i18n\n")])])]),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("p",[t._v("In node:")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" Ajv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// version >= 8.0.0")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" localize "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ajv-i18n"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or for JSON Type Definition")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// const localize = require("ajv-i18n/localize/jtd")')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" ajv "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Ajv")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("allErrors")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("messages")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" validate "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" ajv"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("schema"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" valid "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("validate")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("valid"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ru for Russian")]),t._v("\n localize"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ru")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// string with all errors and data paths")]),t._v("\n console"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ajv"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("errorsText")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("validate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("separator")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'\\n'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("To require only necessary locales (e.g., with browserify):")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" localize_ru "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ajv-i18n/localize/ru'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or for JSON Type Definition")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// const localize_ru = require('ajv-i18n/localize/ru/jtd')")]),t._v("\n")])])]),e("p",[t._v("or")]),t._v(" "),e("div",{staticClass:"language-javascript extra-class"},[e("pre",{pre:!0,attrs:{class:"language-javascript"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" localize "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("en")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ajv-i18n/localize/en'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("ru")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'ajv-i18n/localize/ru'")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("See "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ajv docs"),e("OutboundLink")],1),t._v(" for more information.")]),t._v(" "),e("h2",{attrs:{id:"tests"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tests"}},[t._v("#")]),t._v(" Tests")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("npm install\ngit submodule update --init\nnpm test\n")])])]),e("h2",{attrs:{id:"contributing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributing"}},[t._v("#")]),t._v(" Contributing")]),t._v(" "),e("p",[t._v("Functions that localize error messages are generated using doT template "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n/tree/master/localize/localize.jst",target:"_blank",rel:"noopener noreferrer"}},[t._v("localize.jst"),e("OutboundLink")],1),t._v(", "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n/tree/master/messages/index.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Schema messages"),e("OutboundLink")],1),t._v(" and "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n/tree/master/messages/jtd.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("JSON Type Definition messages"),e("OutboundLink")],1),t._v(". Templates are pre-compiled, so doT is not a run-time dependency.")]),t._v(" "),e("p",[e("code",[t._v("npm run build")]),t._v(" - compiles functions to "),e("a",{attrs:{href:"https://github.com/ajv-validator/ajv/tree/master/localize",target:"_blank",rel:"noopener noreferrer"}},[t._v("localize"),e("OutboundLink")],1),t._v(" folder.")]),t._v(" "),e("h2",{attrs:{id:"contributors-of-locales"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contributors-of-locales"}},[t._v("#")]),t._v(" Contributors of locales")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/danielzurawski",title:"danielzurawski",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/1625711?v=3&s=40",alt:"danielzurawski"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/szilveszter9",title:"szilveszter9",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars0.githubusercontent.com/u/7540866?v=3&s=40",alt:"szilveszter9"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/jmtoball",title:"jmtoball",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars0.githubusercontent.com/u/219950?v=3&s=40",alt:"jmtoball"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/gilgongo",title:"gilgongo",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/4561747?v=3&s=40",alt:"gilgongo"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/jasoniangreen",title:"jasoniangreen",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/3481367?v=3&s=40",alt:"jasoniangreen"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/jpablom",title:"jpablom",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars0.githubusercontent.com/u/3935083?v=3&s=40",alt:"jpablom"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/Limmen",title:"Limmen",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/8254791?v=3&s=40",alt:"limmen"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/jinzhubaofu",title:"jinzhubaofu",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/811195?v=3&s=40",alt:"jinzhubaofu"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/kiskovacs",title:"kiskovacs",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars1.githubusercontent.com/u/2733311?v=3&s=40",alt:"kiskovacs"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/Mahmoud-Mardeni",title:"mahmoud-mardeni",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/19661270?s=40&v=3",alt:"mahmoud-mardeni"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/monlouisj",title:"monlouisj",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars0.githubusercontent.com/u/5998380?v=3&s=40",alt:"monlouisj"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/marcosrava",title:"marcosrava",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/243790?v=3&s=40",alt:"marcosrava"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/mtramm",title:"mtramm",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/3519541?v=3&s=40",alt:"mtramm"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/Mahmoud-Mardeni",title:"Mahmoud-Mardeni",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/19661270?v=3&s=40",alt:"Mahmoud-Mardeni"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/leuction",title:"leuction",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/8056270?v=3&s=40",alt:"leuction"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/lucacorti",title:"lucacorti",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/1076999?v=3&s=40",alt:"lucacorti"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/minipai",title:"minipai",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/239570?s=40&v=4",alt:"minipai"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/encX",title:"encX",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/5965883?v=3&s=40",alt:"encX"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/pimlie",title:"pimlie",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/1067403?s=40&v=4",alt:"pimlie",width:"40px"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/MinByeongDon",title:"MinByeongDon",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/6141807?s=40&v=4",alt:"MinByeongDon"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/gflohr",title:"gflohr",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars0.githubusercontent.com/u/7126580?s=40&v=4",alt:"gflohr"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/ekoeryanto",title:"ekoeryanto",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/36023898?s=40&v=4",alt:"ekoeryanto"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/Telokis",title:"Telokis",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/6382729?s=40&v=4",alt:"Telokis"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/alexandreec",title:"alexandreec",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/15526814?s=40&v=4",alt:"alexandreec",width:"40px"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/ggondim",title:"ggondim",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars2.githubusercontent.com/u/2074685?s=40&v=4",alt:"ggondim"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/niekvb",title:"niekvb",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars3.githubusercontent.com/u/37668320?s=40&v=4",alt:"niekvb"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/NAM0007",title:"NAM0007",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars1.githubusercontent.com/u/47188486?s=40&v=4",alt:"NAM0007"}}),e("OutboundLink")],1),t._v(" "),e("a",{attrs:{href:"https://github.com/saulipurhonen",title:"saulipurhonen",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:"https://avatars.githubusercontent.com/u/48789543?s=40&v=4",alt:"saulipurhonen"}}),e("OutboundLink")],1)]),t._v(" "),e("h2",{attrs:{id:"enterprise-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#enterprise-support"}},[t._v("#")]),t._v(" Enterprise support")]),t._v(" "),e("p",[t._v("ajv-i18n package is a part of "),e("a",{attrs:{href:"https://tidelift.com/subscription/pkg/npm-ajv-i18n?utm_source=npm-ajv-i18n&utm_medium=referral&utm_campaign=enterprise&utm_term=repo",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tidelift enterprise subscription"),e("OutboundLink")],1),t._v(" - it provides a centralised commercial support to open-source software users, in addition to the support provided by software maintainers.")]),t._v(" "),e("h2",{attrs:{id:"security-contact"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#security-contact"}},[t._v("#")]),t._v(" Security contact")]),t._v(" "),e("p",[t._v("To report a security vulnerability, please use the\n"),e("a",{attrs:{href:"https://tidelift.com/security",target:"_blank",rel:"noopener noreferrer"}},[t._v("Tidelift security contact"),e("OutboundLink")],1),t._v(".\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerability via GitHub issues.")]),t._v(" "),e("h2",{attrs:{id:"license"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[t._v("#")]),t._v(" License")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t._v("MIT"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/81.b73b1070.js b/assets/js/81.b73b1070.js new file mode 100644 index 000000000..5fa2c573f --- /dev/null +++ b/assets/js/81.b73b1070.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{428:function(e,t,a){"use strict";a.r(t);var s=a(14),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"security-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-considerations"}},[e._v("#")]),e._v(" Security considerations")]),e._v(" "),t("p",[e._v("JSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider.")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#security-contact"}},[e._v("Security contact")])]),t("li",[t("a",{attrs:{href:"#untrusted-schemas"}},[e._v("Untrusted schemas")])]),t("li",[t("a",{attrs:{href:"#circular-references-in-javascript-objects"}},[e._v("Circular references in JavaScript objects")])]),t("li",[t("a",{attrs:{href:"#security-risks-of-trusted-schemas"}},[e._v("Security risks of trusted schemas")])]),t("li",[t("a",{attrs:{href:"#redos-attack"}},[e._v("ReDoS attack")])]),t("li",[t("a",{attrs:{href:"#content-security-policy"}},[e._v("Content Security Policy")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"security-contact"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-contact"}},[e._v("#")]),e._v(" Security contact")]),e._v(" "),t("p",[e._v("To report a security vulnerability, please use the\n"),t("a",{attrs:{href:"https://tidelift.com/security",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tidelift security contact"),t("OutboundLink")],1),e._v(".\nTidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues.")]),e._v(" "),t("h2",{attrs:{id:"untrusted-schemas"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#untrusted-schemas"}},[e._v("#")]),e._v(" Untrusted schemas")]),e._v(" "),t("p",[e._v("Ajv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application.")]),e._v(" "),t("p",[e._v("If your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent:")]),e._v(" "),t("ul",[t("li",[e._v("compiling schemas can cause stack overflow (if they are too deep)")]),e._v(" "),t("li",[e._v("compiling schemas can be slow (e.g. "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/557",target:"_blank",rel:"noopener noreferrer"}},[e._v("#557"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("validating certain data can be slow")])]),e._v(" "),t("p",[e._v("It is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in "),t("code",[e._v("pattern")]),e._v(" and "),t("code",[e._v("patternProperties")]),e._v(" keywords.")]),e._v(" "),t("p",[e._v("Regardless the measures you take, using untrusted schemas increases security risks.")]),e._v(" "),t("h2",{attrs:{id:"circular-references-in-javascript-objects"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#circular-references-in-javascript-objects"}},[e._v("#")]),e._v(" Circular references in JavaScript objects")]),e._v(" "),t("p",[e._v("Ajv does not support schemas and validated data that have circular references in objects. See "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/802",target:"_blank",rel:"noopener noreferrer"}},[e._v("issue #802"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("An attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references.")]),e._v(" "),t("h2",{attrs:{id:"security-risks-of-trusted-schemas"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-risks-of-trusted-schemas"}},[e._v("#")]),e._v(" Security risks of trusted schemas")]),e._v(" "),t("p",[e._v("Some keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to):")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("pattern")]),e._v(" and "),t("code",[e._v("format")]),e._v(" for large strings - in some cases using "),t("code",[e._v("maxLength")]),e._v(" can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see "),t("a",{attrs:{href:"#redos-attack"}},[e._v("ReDoS attack")]),e._v(").")]),e._v(" "),t("li",[t("code",[e._v("patternProperties")]),e._v(" for large property names - use "),t("code",[e._v("propertyNames")]),e._v(" to mitigate, but some regular expressions can have exponential evaluation time as well.")]),e._v(" "),t("li",[t("code",[e._v("uniqueItems")]),e._v(" for large non-scalar arrays - use "),t("code",[e._v("maxItems")]),e._v(" to mitigate")])]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Do NOT use allErrors in production")]),e._v(" "),t("p",[e._v("The suggestions above to prevent slow validation would only work if you do NOT use "),t("code",[e._v("allErrors: true")]),e._v(" in production code (using it would continue validation after validation errors).")])]),e._v(" "),t("p",[e._v("You can validate your JSON schemas against "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-secure.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("this meta-schema"),t("OutboundLink")],1),e._v(" to check that these recommendations are followed:")]),e._v(" "),t("div",{staticClass:"language-javascript extra-class"},[t("pre",{pre:!0,attrs:{class:"language-javascript"}},[t("code",[e._v("ajv "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("new")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Ajv")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("strictTypes")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// this option is required for this schema")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" isSchemaSecure "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" ajv"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("compile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("require")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ajv/lib/refs/json-schema-secure.json"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" schema1 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("format")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"email"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("isSchemaSecure")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("schema1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// false")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" schema2 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("format")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"email"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token literal-property property"}},[e._v("maxLength")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token constant"}},[e._v("MAX_LENGTH")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("isSchemaSecure")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("schema2"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// true")]),e._v("\n")])])]),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Untrusted data")]),e._v(" "),t("p",[e._v("Following all these recommendation is not a guarantee that validation using of untrusted data is safe - it can still lead to some undesirable results.")])]),e._v(" "),t("h2",{attrs:{id:"redos-attack"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redos-attack"}},[e._v("#")]),e._v(" ReDoS attack")]),e._v(" "),t("p",[e._v("Certain regular expressions can lead to the exponential evaluation time even with relatively short strings.")]),e._v(" "),t("p",[e._v("Please assess the regular expressions you use in the schemas on their vulnerability to this attack - see "),t("a",{attrs:{href:"https://github.com/substack/safe-regex",target:"_blank",rel:"noopener noreferrer"}},[e._v("safe-regex"),t("OutboundLink")],1),e._v(", for example.")]),e._v(" "),t("p",[e._v("By default, Ajv uses the regex engine built into Node.js. This engine has exponential worst-case performance. This performance (and ReDoS attacks) can be mitigated by using a linear-time regex engine. Ajv supports the use of a third-party regex engine for this purpose.")]),e._v(" "),t("p",[e._v("To use a third-party regex engine in Ajv, set the ajv.opts.code.regExp property to that regex engine during instantiation. Here we use Google’s RE2 engine as an example.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('const Ajv = require("ajv") \nconst RE2 = require("re2") \nconst ajv = new Ajv({code: {regExp: RE2}}) \n')])])]),t("p",[e._v("For details about the interface of the "),t("code",[e._v("regexp")]),e._v(" option, see options.md under the docs folder.")]),e._v(" "),t("p",[e._v("Although linear-time regex engines eliminate ReDoS vulnerabilities, changing a regex engine carries some risk, including:")]),e._v(" "),t("ul",[t("li",[e._v("Minor changes in regex syntax.")]),e._v(" "),t("li",[e._v("Minor changes in regex semantics. For example, RE2 always interprets regexes in Unicode, and disagrees with JavaScript in its definition of whitespace. To avoid regressions, develop and test your regexes in the same regex engine that you use in production.")]),e._v(" "),t("li",[e._v("May not support some advanced features, such as look-aheads or back-references.")]),e._v(" "),t("li",[e._v("May have (minor) common-case performance degradation.")]),e._v(" "),t("li",[e._v("Increases size of distributable (e.g. RE2 includes a non-trivial C component).")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("ReDoS attack")]),e._v(" "),t("p",[e._v("Some formats that "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[e._v("ajv-formats"),t("OutboundLink")],1),e._v(" package implements use "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats/blob/master/src/formats.ts",target:"_blank",rel:"noopener noreferrer"}},[e._v("regular expressions"),t("OutboundLink")],1),e._v(" that can be vulnerable to ReDoS attack.")])]),e._v(" "),t("p",[e._v("If you use Ajv to validate data from untrusted sources "),t("strong",[e._v("it is strongly recommended")]),e._v(" to consider the following:")]),e._v(" "),t("ul",[t("li",[e._v('making assessment of "format" implementations in '),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[e._v("ajv-formats"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("passing "),t("code",[e._v('"fast"')]),e._v(" option to ajv-formats plugin (see its docs) that simplifies some of the regular expressions (although it does not guarantee that they are safe).")]),e._v(" "),t("li",[e._v('replacing format implementations provided by ajv-formats with your own implementations of "format" keyword that either use different regular expressions or another approach to format validation. Please see '),t("a",{attrs:{href:"#api-addformat"}},[e._v("addFormat")]),e._v(" method.")]),e._v(" "),t("li",[e._v('disabling format validation by ignoring "format" keyword with option '),t("code",[e._v("format: false")])])]),e._v(" "),t("p",[e._v("Whatever mitigation you choose, please assume all formats provided by ajv-formats as potentially unsafe and make your own assessment of their suitability for your validation scenarios.")]),e._v(" "),t("h2",{attrs:{id:"content-security-policy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#content-security-policy"}},[e._v("#")]),e._v(" Content Security Policy")]),e._v(" "),t("p",[e._v("When using Ajv in a browser page with enabled Content Security Policy (CSP), "),t("code",[e._v("script-src")]),e._v(" directive must include "),t("code",[e._v("'unsafe-eval'")]),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Cross-site scripting attacks")]),e._v(" "),t("p",[t("code",[e._v("unsafe-eval")]),e._v(" is NOT recommended in a secure CSP"),t("a",{attrs:{href:"https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-eval",target:"_blank",rel:"noopener noreferrer"}},[e._v("[1]"),t("OutboundLink")],1),e._v(", as it has the potential to open the document to cross-site scripting (XSS) attacks.")])]),e._v(" "),t("p",[e._v("In order to use Ajv without relaxing CSP, you can "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv-cli#compile-schemas",target:"_blank",rel:"noopener noreferrer"}},[e._v("compile the schemas using CLI"),t("OutboundLink")],1),e._v(" or programmatically in your build code - see "),t("RouterLink",{attrs:{to:"/standalone.html"}},[e._v("Standalone validation code")]),e._v(". Compiled JavaScript file can export one or several validation functions that have the same code as the schemas compiled at runtime.")],1)])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/app.7f6e3378.js b/assets/js/app.7f6e3378.js new file mode 100644 index 000000000..4c2f53f5c --- /dev/null +++ b/assets/js/app.7f6e3378.js @@ -0,0 +1,16 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,a,s=t[0],l=t[1],u=t[2],f=0,p=[];f
'};function o(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var l=n.render(!t),u=l.querySelector(r.barSelector),c=r.speed,f=r.easing;return l.offsetWidth,a((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,o}(e,c,f)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,a=t.querySelector(r.barSelector),l=e?"-100":i(n.status||0),c=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var a=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+i)in n)return r;return t}(n))}function r(e,t,r){t=n(t),e.style[t]=r}return function(e,t){var n,o,i=arguments;if(2==i.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&r(e,n,o);else r(e,i[1],i[2])}}();function l(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function c(e,t){var n,r=f(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=o)},function(e,t,n){"use strict";var r=n(0),o=n(45).f,i=n(12),a=n(90),s=n(32),l=n(60),u=n(118);e.exports=function(e,t){var n,c,f,p,d,v=e.target,h=e.global,m=e.stat;if(n=h?r:m?r[v]||s(v,{}):r[v]&&r[v].prototype)for(c in t){if(p=t[c],f=e.dontCallGetSet?(d=o(n,c))&&d.value:n[c],!u(h?c:v+(m?".":"#")+c,e.forced)&&void 0!==f){if(typeof p==typeof f)continue;l(p,f)}(e.sham||f&&f.sham)&&i(p,"sham",!0),a(n,c,p,e)}}},function(e,t,n){"use strict";var r=n(25),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(e,t,n){"use strict";var r=n(3);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},function(e,t,n){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var r=n(46),o=n(47);e.exports=function(e){return r(o(e))}},function(e,t,n){"use strict";var r=n(0),o=n(1),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},function(e,t,n){"use strict";var r=n(1),o=n(100),i=TypeError;e.exports=function(e){if(r(e))return e;throw new i(o(e)+" is not a function")}},function(e,t,n){"use strict";var r=n(0),o=n(55),i=n(8),a=n(57),s=n(53),l=n(52),u=r.Symbol,c=o("wks"),f=l?u.for||u:u&&u.withoutSetter||a;e.exports=function(e){return i(c,e)||(c[e]=s&&i(u,e)?u[e]:f("Symbol."+e)),c[e]}},function(e,t,n){"use strict";var r=n(56),o=n(0),i=n(32),a=e.exports=o["__core-js_shared__"]||i("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.36.0",mode:r?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.36.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(e,t,n){"use strict";var r=n(0),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},function(e,t,n){"use strict";var r=n(47),o=Object;e.exports=function(e){return o(r(e))}},function(e,t,n){"use strict";var r=n(7),o=String,i=TypeError;e.exports=function(e){if(r(e))return e;throw new i(o(e)+" is not an object")}},function(e,t,n){"use strict";var r=n(115);e.exports=function(e){return r(e.length)}},function(e,t,n){var r=n(142),o=n(10),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(e){return o(e)&&a.call(e,"callee")&&!s.call(e,"callee")};e.exports=l},function(e,t,n){var r=n(9)(n(6),"Map");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(162),o=n(169),i=n(171),a=n(172),s=n(173);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(4),o=n(43),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(a.test(e)||!i.test(e)||null!=t&&e in Object(t))}},function(e,t,n){var r=n(11),o=n(10);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,n){"use strict";var r=n(5),o=n(24),i=n(96),a=n(26),s=n(27),l=n(49),u=n(8),c=n(58),f=Object.getOwnPropertyDescriptor;t.f=r?f:function(e,t){if(e=s(e),t=l(t),c)try{return f(e,t)}catch(e){}if(u(e,t))return a(!o(i.f,e,t),e[t])}},function(e,t,n){"use strict";var r=n(2),o=n(3),i=n(16),a=Object,s=r("".split);e.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"===i(e)?s(e,""):a(e)}:a},function(e,t,n){"use strict";var r=n(48),o=TypeError;e.exports=function(e){if(r(e))throw new o("Can't call method on "+e);return e}},function(e,t,n){"use strict";e.exports=function(e){return null==e}},function(e,t,n){"use strict";var r=n(97),o=n(50);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},function(e,t,n){"use strict";var r=n(28),o=n(1),i=n(51),a=n(52),s=Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return o(t)&&i(t.prototype,s(e))}},function(e,t,n){"use strict";var r=n(2);e.exports=r({}.isPrototypeOf)},function(e,t,n){"use strict";var r=n(53);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var r=n(54),o=n(3),i=n(0).String;e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol("symbol detection");return!i(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){"use strict";var r,o,i=n(0),a=n(98),s=i.process,l=i.Deno,u=s&&s.versions||l&&l.version,c=u&&u.v8;c&&(o=(r=c.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},function(e,t,n){"use strict";var r=n(31);e.exports=function(e,t){return r[e]||(r[e]=t||{})}},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";var r=n(2),o=0,i=Math.random(),a=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++o+i,36)}},function(e,t,n){"use strict";var r=n(5),o=n(3),i=n(102);e.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var r=n(8),o=n(109),i=n(45),a=n(15);e.exports=function(e,t,n){for(var s=o(t),l=a.f,u=i.f,c=0;cc))return!1;var p=l.get(e),d=l.get(t);if(p&&d)return p==t&&d==e;var v=-1,h=!0,m=2&n?new r:void 0;for(l.set(e,t),l.set(t,e);++v-1&&e%1==0&&e]/;e.exports=function(e){var t,n=""+e,o=r.exec(n);if(!o)return n;var i="",a=0,s=0;for(a=o.index;a79&&a<83||!i("reduce")},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},function(e,t,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);t.f=i?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},function(e,t,n){"use strict";var r=n(24),o=n(7),i=n(50),a=n(99),s=n(101),l=n(30),u=TypeError,c=l("toPrimitive");e.exports=function(e,t){if(!o(e)||i(e))return e;var n,l=a(e,c);if(l){if(void 0===t&&(t="default"),n=r(l,e,t),!o(n)||i(n))return n;throw new u("Can't convert object to primitive value")}return void 0===t&&(t="number"),s(e,t)}},function(e,t,n){"use strict";e.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(e,t,n){"use strict";var r=n(29),o=n(48);e.exports=function(e,t){var n=e[t];return o(n)?void 0:r(n)}},function(e,t,n){"use strict";var r=String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},function(e,t,n){"use strict";var r=n(24),o=n(1),i=n(7),a=TypeError;e.exports=function(e,t){var n,s;if("string"===t&&o(n=e.toString)&&!i(s=r(n,e)))return s;if(o(n=e.valueOf)&&!i(s=r(n,e)))return s;if("string"!==t&&o(n=e.toString)&&!i(s=r(n,e)))return s;throw new a("Can't convert object to primitive value")}},function(e,t,n){"use strict";var r=n(0),o=n(7),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},function(e,t,n){"use strict";var r=n(5),o=n(3);e.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(e,t,n){"use strict";var r=n(5),o=n(8),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),l=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);e.exports={EXISTS:s,PROPER:l,CONFIGURABLE:u}},function(e,t,n){"use strict";var r=n(2),o=n(1),i=n(31),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return a(e)}),e.exports=i.inspectSource},function(e,t,n){"use strict";var r,o,i,a=n(107),s=n(0),l=n(7),u=n(12),c=n(8),f=n(31),p=n(108),d=n(59),v=s.TypeError,h=s.WeakMap;if(a||f.state){var m=f.state||(f.state=new h);m.get=m.get,m.has=m.has,m.set=m.set,r=function(e,t){if(m.has(e))throw new v("Object already initialized");return t.facade=e,m.set(e,t),t},o=function(e){return m.get(e)||{}},i=function(e){return m.has(e)}}else{var g=p("state");d[g]=!0,r=function(e,t){if(c(e,g))throw new v("Object already initialized");return t.facade=e,u(e,g,t),t},o=function(e){return c(e,g)?e[g]:{}},i=function(e){return c(e,g)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw new v("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var r=n(0),o=n(1),i=r.WeakMap;e.exports=o(i)&&/native code/.test(String(i))},function(e,t,n){"use strict";var r=n(55),o=n(57),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t,n){"use strict";var r=n(28),o=n(2),i=n(110),a=n(117),s=n(34),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(s(e)),n=a.f;return n?l(t,n(e)):t}},function(e,t,n){"use strict";var r=n(111),o=n(116).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t,n){"use strict";var r=n(2),o=n(8),i=n(27),a=n(112).indexOf,s=n(59),l=r([].push);e.exports=function(e,t){var n,r=i(e),u=0,c=[];for(n in r)!o(s,n)&&o(r,n)&&l(c,n);for(;t.length>u;)o(r,n=t[u++])&&(~a(c,n)||l(c,n));return c}},function(e,t,n){"use strict";var r=n(27),o=n(113),i=n(35),a=function(e){return function(t,n,a){var s=r(t),l=i(s);if(0===l)return!e&&-1;var u,c=o(a,l);if(e&&n!=n){for(;l>c;)if((u=s[c++])!=u)return!0}else for(;l>c;c++)if((e||c in s)&&s[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:a(!0),indexOf:a(!1)}},function(e,t,n){"use strict";var r=n(61),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},function(e,t,n){"use strict";var r=Math.ceil,o=Math.floor;e.exports=Math.trunc||function(e){var t=+e;return(t>0?o:r)(t)}},function(e,t,n){"use strict";var r=n(61),o=Math.min;e.exports=function(e){var t=r(e);return t>0?o(t,9007199254740991):0}},function(e,t,n){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,n){"use strict";var r=n(3),o=n(1),i=/#|\.prototype\./,a=function(e,t){var n=l[s(e)];return n===c||n!==u&&(o(t)?r(t):!!t)},s=a.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=a.data={},u=a.NATIVE="N",c=a.POLYFILL="P";e.exports=a},function(e,t,n){"use strict";var r=n(29),o=n(33),i=n(46),a=n(35),s=TypeError,l="Reduce of empty array with no initial value",u=function(e){return function(t,n,u,c){var f=o(t),p=i(f),d=a(f);if(r(n),0===d&&u<2)throw new s(l);var v=e?d-1:0,h=e?-1:1;if(u<2)for(;;){if(v in p){c=p[v],v+=h;break}if(v+=h,e?v<0:d<=v)throw new s(l)}for(;e?v>=0:d>v;v+=h)v in p&&(c=n(c,p[v],v,f));return c}};e.exports={left:u(!1),right:u(!0)}},function(e,t,n){"use strict";var r=n(3);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){return 1},1)}))}},function(e,t,n){"use strict";var r=n(0),o=n(16);e.exports="process"===o(r.process)},function(e,t,n){"use strict";var r=n(23),o=n(0),i=n(123),a=n(124),s=o.WebAssembly,l=7!==new Error("e",{cause:7}).cause,u=function(e,t){var n={};n[e]=a(e,t,l),r({global:!0,constructor:!0,arity:1,forced:l},n)},c=function(e,t){if(s&&s[e]){var n={};n[e]=a("WebAssembly."+e,t,l),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:l},n)}};u("Error",(function(e){return function(t){return i(e,this,arguments)}})),u("EvalError",(function(e){return function(t){return i(e,this,arguments)}})),u("RangeError",(function(e){return function(t){return i(e,this,arguments)}})),u("ReferenceError",(function(e){return function(t){return i(e,this,arguments)}})),u("SyntaxError",(function(e){return function(t){return i(e,this,arguments)}})),u("TypeError",(function(e){return function(t){return i(e,this,arguments)}})),u("URIError",(function(e){return function(t){return i(e,this,arguments)}})),c("CompileError",(function(e){return function(t){return i(e,this,arguments)}})),c("LinkError",(function(e){return function(t){return i(e,this,arguments)}})),c("RuntimeError",(function(e){return function(t){return i(e,this,arguments)}}))},function(e,t,n){"use strict";var r=n(25),o=Function.prototype,i=o.apply,a=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(e,t,n){"use strict";var r=n(28),o=n(8),i=n(12),a=n(51),s=n(62),l=n(60),u=n(128),c=n(129),f=n(130),p=n(133),d=n(134),v=n(5),h=n(56);e.exports=function(e,t,n,m){var g=m?2:1,y=e.split("."),b=y[y.length-1],_=r.apply(null,y);if(_){var w=_.prototype;if(!h&&o(w,"cause")&&delete w.cause,!n)return _;var x=r("Error"),j=t((function(e,t){var n=f(m?t:e,void 0),r=m?new _(e):new _;return void 0!==n&&i(r,"message",n),d(r,j,r.stack,2),this&&a(w,this)&&c(r,this,j),arguments.length>g&&p(r,arguments[g]),r}));if(j.prototype=w,"Error"!==b?s?s(j,x):l(j,x,{name:!0}):v&&"stackTraceLimit"in _&&(u(j,_,"stackTraceLimit"),u(j,_,"prepareStackTrace")),l(j,_),!h)try{w.name!==b&&i(w,"name",b),w.constructor=j}catch(e){}return j}}},function(e,t,n){"use strict";var r=n(2),o=n(29);e.exports=function(e,t,n){try{return r(o(Object.getOwnPropertyDescriptor(e,t)[n]))}catch(e){}}},function(e,t,n){"use strict";var r=n(127),o=String,i=TypeError;e.exports=function(e){if(r(e))return e;throw new i("Can't set "+o(e)+" as a prototype")}},function(e,t,n){"use strict";var r=n(7);e.exports=function(e){return r(e)||null===e}},function(e,t,n){"use strict";var r=n(15).f;e.exports=function(e,t,n){n in e||r(e,n,{configurable:!0,get:function(){return t[n]},set:function(e){t[n]=e}})}},function(e,t,n){"use strict";var r=n(1),o=n(7),i=n(62);e.exports=function(e,t,n){var a,s;return i&&r(a=t.constructor)&&a!==n&&o(s=a.prototype)&&s!==n.prototype&&i(e,s),e}},function(e,t,n){"use strict";var r=n(91);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:r(e)}},function(e,t,n){"use strict";var r=n(132),o=n(1),i=n(16),a=n(30)("toStringTag"),s=Object,l="Arguments"===i(function(){return arguments}());e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=s(e),a))?n:l?i(t):"Object"===(r=i(t))&&o(t.callee)?"Arguments":r}},function(e,t,n){"use strict";var r={};r[n(30)("toStringTag")]="z",e.exports="[object z]"===String(r)},function(e,t,n){"use strict";var r=n(7),o=n(12);e.exports=function(e,t){r(t)&&"cause"in t&&o(e,"cause",t.cause)}},function(e,t,n){"use strict";var r=n(12),o=n(135),i=n(136),a=Error.captureStackTrace;e.exports=function(e,t,n,s){i&&(a?a(e,t):r(e,"stack",o(n,s)))}},function(e,t,n){"use strict";var r=n(2),o=Error,i=r("".replace),a=String(new o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,l=s.test(a);e.exports=function(e,t){if(l&&"string"==typeof e&&!o.prepareStackTrace)for(;t--;)e=i(e,s,"");return e}},function(e,t,n){"use strict";var r=n(3),o=n(26);e.exports=!r((function(){var e=new Error("a");return!("stack"in e)||(Object.defineProperty(e,"stack",o(1,7)),7!==e.stack)}))},function(e,t,n){"use strict";var r=n(5),o=n(138),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();e.exports=s?function(e,t){if(o(e)&&!a(e,"length").writable)throw new i("Cannot set read only .length");return e.length=t}:function(e,t){return e.length=t}},function(e,t,n){"use strict";var r=n(16);e.exports=Array.isArray||function(e){return"Array"===r(e)}},function(e,t,n){"use strict";var r=TypeError;e.exports=function(e){if(e>9007199254740991)throw r("Maximum allowed index exceeded");return e}},function(e,t,n){var r=n(63),o=n(141);e.exports=function e(t,n,i,a,s){var l=-1,u=t.length;for(i||(i=o),s||(s=[]);++l0&&i(c)?n>1?e(c,n-1,i,a,s):r(s,c):a||(s[s.length]=c)}return s}},function(e,t,n){var r=n(13),o=n(36),i=n(4),a=r?r.isConcatSpreadable:void 0;e.exports=function(e){return i(e)||o(e)||!!(a&&e&&e[a])}},function(e,t,n){var r=n(11),o=n(10);e.exports=function(e){return o(e)&&"[object Arguments]"==r(e)}},function(e,t,n){var r=n(13),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=i.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=a.call(e);return r&&(t?e[s]=n:delete e[s]),o}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(146),o=n(202),i=n(44),a=n(4),s=n(212);e.exports=function(e){return"function"==typeof e?e:null==e?i:"object"==typeof e?a(e)?o(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(147),o=n(201),i=n(81);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?i(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(65),o=n(69);e.exports=function(e,t,n,i){var a=n.length,s=a,l=!i;if(null==e)return!s;for(e=Object(e);a--;){var u=n[a];if(l&&u[2]?u[1]!==e[u[0]]:!(u[0]in e))return!1}for(;++a-1}},function(e,t,n){var r=n(18);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},function(e,t,n){var r=n(17);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(17),o=n(37),i=n(39);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([e,t]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(67),o=n(159),i=n(38),a=n(68),s=/^\[object .+?Constructor\]$/,l=Function.prototype,u=Object.prototype,c=l.toString,f=u.hasOwnProperty,p=RegExp("^"+c.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!i(e)||o(e))&&(r(e)?p:s).test(a(e))}},function(e,t,n){var r,o=n(160),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";e.exports=function(e){return!!i&&i in e}},function(e,t,n){var r=n(6)["__core-js_shared__"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,n){var r=n(163),o=n(17),i=n(37);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},function(e,t,n){var r=n(164),o=n(165),i=n(166),a=n(167),s=n(168);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(71),o=n(224),i=n(229),a=n(72),s=n(230),l=n(40);e.exports=function(e,t,n){var u=-1,c=o,f=e.length,p=!0,d=[],v=d;if(n)p=!1,c=i;else if(f>=200){var h=t?null:s(e);if(h)return l(h);p=!1,c=a,v=new r}else v=t?[]:d;e:for(;++u-1}},function(e,t,n){var r=n(226),o=n(227),i=n(228);e.exports=function(e,t,n){return t==t?i(e,t,n):r(e,o,n)}},function(e,t){e.exports=function(e,t,n,r){for(var o=e.length,i=n+(r?1:-1);r?i--:++i=0&&Math.floor(t)===t&&isFinite(e)}function h(e){return a(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function m(e){return null==e?"":Array.isArray(e)||p(e)&&e.toString===f?JSON.stringify(e,g,2):String(e)}function g(e,t){return t&&t.__v_isRef?t.value:t}function y(e){var t=parseFloat(e);return isNaN(t)?e:t}function b(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o-1)return e.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function j(e,t){return x.call(e,t)}function k(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var S=/-(\w)/g,O=k((function(e){return e.replace(S,(function(e,t){return t?t.toUpperCase():""}))})),C=k((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),P=/\B([A-Z])/g,$=k((function(e){return e.replace(P,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function A(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function T(e,t){for(var n in t)e[n]=t[n];return e}function L(e){for(var t={},n=0;n0,Y=Z&&Z.indexOf("edge/")>0;Z&&Z.indexOf("android");var ee=Z&&/iphone|ipad|ipod|ios/.test(Z);Z&&/chrome\/\d+/.test(Z),Z&&/phantomjs/.test(Z);var te,ne=Z&&Z.match(/firefox\/(\d+)/),re={}.watch,oe=!1;if(G)try{var ie={};Object.defineProperty(ie,"passive",{get:function(){oe=!0}}),window.addEventListener("test-passive",null,ie)}catch(e){}var ae=function(){return void 0===te&&(te=!G&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),te},se=G&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function le(e){return"function"==typeof e&&/native code/.test(e.toString())}var ue,ce="undefined"!=typeof Symbol&&le(Symbol)&&"undefined"!=typeof Reflect&&le(Reflect.ownKeys);ue="undefined"!=typeof Set&&le(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var fe=null;function pe(e){void 0===e&&(e=null),e||fe&&fe._scope.off(),fe=e,e&&e._scope.on()}var de=function(){function e(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(e.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),e}(),ve=function(e){void 0===e&&(e="");var t=new de;return t.text=e,t.isComment=!0,t};function he(e){return new de(void 0,void 0,void 0,String(e))}function me(e){var t=new de(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}"function"==typeof SuppressedError&&SuppressedError;var ge=0,ye=[],be=function(){function e(){this._pending=!1,this.id=ge++,this.subs=[]}return e.prototype.addSub=function(e){this.subs.push(e)},e.prototype.removeSub=function(e){this.subs[this.subs.indexOf(e)]=null,this._pending||(this._pending=!0,ye.push(this))},e.prototype.depend=function(t){e.target&&e.target.addDep(this)},e.prototype.notify=function(e){var t=this.subs.filter((function(e){return e}));for(var n=0,r=t.length;n0&&(Ze((u=e(u,"".concat(n||"","_").concat(r)))[0])&&Ze(f)&&(p[c]=he(f.text+u[0].text),u.shift()),p.push.apply(p,u)):l(u)?Ze(f)?p[c]=he(f.text+u):""!==u&&p.push(he(u)):Ze(u)&&Ze(f)?p[c]=he(f.text+u.text):(s(t._isVList)&&a(u.tag)&&i(u.key)&&a(n)&&(u.key="__vlist".concat(n,"_").concat(r,"__")),p.push(u)));return p}(e):void 0}function Ze(e){return a(e)&&a(e.text)&&!1===e.isComment}function Xe(e,t){var n,r,i,s,l=null;if(o(e)||"string"==typeof e)for(l=new Array(e.length),n=0,r=e.length;n0,s=t?!!t.$stable:!a,l=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(s&&o&&o!==r&&l===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},t)t[u]&&"$"!==u[0]&&(i[u]=mt(e,n,u,t[u]))}else i={};for(var c in n)c in i||(i[c]=gt(n,c));return t&&Object.isExtensible(t)&&(t._normalized=i),H(i,"$stable",s),H(i,"$key",l),H(i,"$hasNormal",a),i}function mt(e,t,n,r){var i=function(){var t=fe;pe(e);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:Ge(n))&&n[0];return pe(t),n&&(!i||1===n.length&&i.isComment&&!vt(i))?void 0:n};return r.proxy&&Object.defineProperty(t,n,{get:i,enumerable:!0,configurable:!0}),i}function gt(e,t){return function(){return e[t]}}function yt(e){return{get attrs(){if(!e._attrsProxy){var t=e._attrsProxy={};H(t,"_v_attr_proxy",!0),bt(t,e.$attrs,r,e,"$attrs")}return e._attrsProxy},get listeners(){e._listenersProxy||bt(e._listenersProxy={},e.$listeners,r,e,"$listeners");return e._listenersProxy},get slots(){return function(e){e._slotsProxy||wt(e._slotsProxy={},e.$scopedSlots);return e._slotsProxy}(e)},emit:E(e.$emit,e),expose:function(t){t&&Object.keys(t).forEach((function(n){return Ue(e,t,n)}))}}}function bt(e,t,n,r,o){var i=!1;for(var a in t)a in e?t[a]!==n[a]&&(i=!0):(i=!0,_t(e,a,r,o));for(var a in e)a in t||(i=!0,delete e[a]);return i}function _t(e,t,n,r){Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){return n[r][t]}})}function wt(e,t){for(var n in t)e[n]=t[n];for(var n in e)n in t||delete e[n]}var xt=null;function jt(e,t){return(e.__esModule||ce&&"Module"===e[Symbol.toStringTag])&&(e=e.default),c(e)?t.extend(e):e}function kt(e){if(o(e))for(var t=0;tdocument.createEvent("Event").timeStamp&&(un=function(){return cn.now()})}var fn=function(e,t){if(e.post){if(!t.post)return 1}else if(t.post)return-1;return e.id-t.id};function pn(){var e,t;for(ln=un(),an=!0,tn.sort(fn),sn=0;snsn&&tn[n].id>e.id;)n--;tn.splice(n+1,0,e)}else tn.push(e);on||(on=!0,Ft(pn))}}function vn(e,t){if(e){for(var n=Object.create(null),r=ce?Reflect.ownKeys(e):Object.keys(e),o=0;o-1)if(i&&!j(o,"default"))a=!1;else if(""===a||a===$(e)){var l=Nn(String,o.type);(l<0||s-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!d(e)&&e.test(t)}function Xn(e,t){var n=e.cache,r=e.keys,o=e._vnode,i=e.$vnode;for(var a in n){var s=n[a];if(s){var l=s.name;l&&!t(l)&&Qn(n,a,r,o)}}i.componentOptions.children=void 0}function Qn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,w(n,t)}Kn.prototype._init=function(e){var t=this;t._uid=Vn++,t._isVue=!0,t.__v_skip=!0,t._scope=new Je(!0),t._scope.parent=void 0,t._scope._vm=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=En(Hn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._provided=n?n._provided:Object.create(null),e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Gt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,o=n&&n.context;e.$slots=pt(t._renderChildren,o),e.$scopedSlots=n?ht(e.$parent,n.data.scopedSlots,e.$slots):r,e._c=function(t,n,r,o){return St(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return St(e,t,n,r,o,!0)};var i=n&&n.data;Te(e,"$attrs",i&&i.attrs||r,null,!0),Te(e,"$listeners",t._parentListeners||r,null,!0)}(t),en(t,"beforeCreate",void 0,!1),function(e){var t=vn(e.$options.inject,e);t&&(Pe(!1),Object.keys(t).forEach((function(n){Te(e,n,t[n])})),Pe(!0))}(t),Fn(t),function(e){var t=e.$options.provide;if(t){var n=u(t)?t.call(e):t;if(!c(n))return;for(var r=Be(e),o=ce?Reflect.ownKeys(n):Object.keys(n),i=0;i1?A(n):n;for(var r=A(arguments,1),o='event handler for "'.concat(e,'"'),i=0,a=n.length;iparseInt(this.max)&&Qn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Qn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){Xn(e,(function(e){return Zn(t,e)}))})),this.$watch("exclude",(function(t){Xn(e,(function(e){return!Zn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=kt(e),n=t&&t.componentOptions;if(n){var r=Gn(n),o=this.include,i=this.exclude;if(o&&(!r||!Zn(o,r))||i&&r&&Zn(i,r))return t;var a=this.cache,s=this.keys,l=null==t.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):t.key;a[l]?(t.componentInstance=a[l].componentInstance,w(s,l),s.push(l)):(this.vnodeToCache=t,this.keyToCache=l),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return B}};Object.defineProperty(e,"config",t),e.util={warn:jn,extend:T,mergeOptions:En,defineReactive:Te},e.set=Le,e.delete=Re,e.nextTick=Ft,e.observable=function(e){return Ae(e),e},e.options=Object.create(null),z.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,T(e.options.components,er),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=A(arguments,1);return n.unshift(this),u(e.install)?e.install.apply(e,n):u(e)&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=En(this.options,e),this}}(e),Wn(e),function(e){z.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&p(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&u(n)&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(Kn),Object.defineProperty(Kn.prototype,"$isServer",{get:ae}),Object.defineProperty(Kn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Kn,"FunctionalRenderContext",{value:hn}),Kn.version="2.7.16";var tr=b("style,class"),nr=b("input,textarea,option,select,progress"),rr=b("contenteditable,draggable,spellcheck"),or=b("events,caret,typing,plaintext-only"),ir=b("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ar="http://www.w3.org/1999/xlink",sr=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},lr=function(e){return sr(e)?e.slice(6,e.length):""},ur=function(e){return null==e||!1===e};function cr(e){for(var t=e.data,n=e,r=e;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=fr(r.data,t));for(;a(n=n.parent);)n&&n.data&&(t=fr(t,n.data));return function(e,t){if(a(e)||a(t))return pr(e,dr(t));return""}(t.staticClass,t.class)}function fr(e,t){return{staticClass:pr(e.staticClass,t.staticClass),class:a(e.class)?[e.class,t.class]:t.class}}function pr(e,t){return e?t?e+" "+t:e:t||""}function dr(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,o=e.length;r-1?Ir(e,t,n):ir(t)?ur(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):rr(t)?e.setAttribute(t,function(e,t){return ur(t)||"false"===t?"false":"contenteditable"===e&&or(t)?t:"true"}(t,n)):sr(t)?ur(n)?e.removeAttributeNS(ar,lr(t)):e.setAttributeNS(ar,t,n):Ir(e,t,n)}function Ir(e,t,n){if(ur(n))e.removeAttribute(t);else{if(X&&!Q&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var Dr={create:Mr,update:Mr};function Fr(e,t){var n=t.elm,r=t.data,o=e.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=cr(t),l=n._transitionClasses;a(l)&&(s=pr(s,dr(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,zr={create:Fr,update:Fr};function Jr(e,t,n){var r=Ur;return function o(){var i=t.apply(null,arguments);null!==i&&Vr(e,o,n,r)}}var Br=At&&!(ne&&Number(ne[1])<=53);function qr(e,t,n,r){if(Br){var o=ln,i=t;t=i._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return i.apply(this,arguments)}}Ur.addEventListener(e,t,oe?{capture:n,passive:r}:n)}function Vr(e,t,n,r){(r||Ur).removeEventListener(e,t._wrapper||t,n)}function Hr(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},r=e.data.on||{};Ur=t.elm||e.elm,function(e){if(a(e.__r)){var t=X?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}a(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),He(n,r,qr,Vr,Jr,t.context),Ur=void 0}}var Kr,Wr={create:Hr,update:Hr,destroy:function(e){return Hr(e,kr)}};function Gr(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,r,o=t.elm,l=e.data.domProps||{},u=t.data.domProps||{};for(n in(a(u.__ob__)||s(u._v_attr_proxy))&&(u=t.data.domProps=T({},u)),l)n in u||(o[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===l[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var c=i(r)?"":String(r);Zr(o,c)&&(o.value=c)}else if("innerHTML"===n&&mr(o.tagName)&&i(o.innerHTML)){(Kr=Kr||document.createElement("div")).innerHTML="".concat(r,"");for(var f=Kr.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==l[n])try{o[n]=r}catch(e){}}}}function Zr(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(a(r)){if(r.number)return y(n)!==y(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var Xr={create:Gr,update:Gr},Qr=k((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function Yr(e){var t=eo(e.style);return e.staticStyle?T(e.staticStyle,t):t}function eo(e){return Array.isArray(e)?L(e):"string"==typeof e?Qr(e):e}var to,no=/^--/,ro=/\s*!important$/,oo=function(e,t,n){if(no.test(t))e.style.setProperty(t,n);else if(ro.test(n))e.style.setProperty($(t),n.replace(ro,""),"important");else{var r=ao(t);if(Array.isArray(n))for(var o=0,i=n.length;o-1?t.split(uo).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" ".concat(e.getAttribute("class")||""," ");n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function fo(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(uo).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" ".concat(e.getAttribute("class")||""," "),r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function po(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&T(t,vo(e.name||"v")),T(t,e),t}return"string"==typeof e?vo(e):void 0}}var vo=k((function(e){return{enterClass:"".concat(e,"-enter"),enterToClass:"".concat(e,"-enter-to"),enterActiveClass:"".concat(e,"-enter-active"),leaveClass:"".concat(e,"-leave"),leaveToClass:"".concat(e,"-leave-to"),leaveActiveClass:"".concat(e,"-leave-active")}})),ho=G&&!Q,mo="transition",go="transitionend",yo="animation",bo="animationend";ho&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(mo="WebkitTransition",go="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(yo="WebkitAnimation",bo="webkitAnimationEnd"));var _o=G?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function wo(e){_o((function(){_o(e)}))}function xo(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),co(e,t))}function jo(e,t){e._transitionClasses&&w(e._transitionClasses,t),fo(e,t)}function ko(e,t,n){var r=Oo(e,t),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?go:bo,l=0,u=function(){e.removeEventListener(s,c),n()},c=function(t){t.target===e&&++l>=a&&u()};setTimeout((function(){l0&&(n="transition",c=a,f=i.length):"animation"===t?u>0&&(n="animation",c=u,f=l.length):f=(n=(c=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:l.length:0,{type:n,timeout:c,propCount:f,hasTransform:"transition"===n&&So.test(r[mo+"Property"])}}function Co(e,t){for(;e.length1}function Lo(e,t){!0!==t.data.show&&$o(t)}var Ro=function(e){var t,n,r={},u=e.modules,c=e.nodeOps;for(t=0;tv?_(e,i(n[g+1])?null:n[g+1].elm,n,d,g,r):d>g&&x(t,f,v)}(f,h,g,n,u):a(g)?(a(e.text)&&c.setTextContent(f,""),_(f,null,g,0,g.length-1,n)):a(h)?x(h,0,h.length-1):a(e.text)&&c.setTextContent(f,""):e.text!==t.text&&c.setTextContent(f,t.text),a(v)&&a(d=v.hook)&&a(d=d.postpatch)&&d(e,t)}}}function O(e,t,n){if(s(n)&&a(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(I(Fo(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}}function Do(e,t){return t.every((function(t){return!I(t,e)}))}function Fo(e){return"_value"in e?e._value:e.value}function Uo(e){e.target.composing=!0}function zo(e){e.target.composing&&(e.target.composing=!1,Jo(e.target,"input"))}function Jo(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Bo(e){return!e.componentInstance||e.data&&e.data.transition?e:Bo(e.componentInstance._vnode)}var qo={model:Mo,show:{bind:function(e,t,n){var r=t.value,o=(n=Bo(n)).data&&n.data.transition,i=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,$o(n,(function(){e.style.display=i}))):e.style.display=r?i:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Bo(n)).data&&n.data.transition?(n.data.show=!0,r?$o(n,(function(){e.style.display=e.__vOriginalDisplay})):Eo(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}}},Vo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Ho(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Ho(kt(t.children)):e}function Ko(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var r in o)t[O(r)]=o[r];return t}function Wo(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Go=function(e){return e.tag||vt(e)},Zo=function(e){return"show"===e.name},Xo={name:"transition",props:Vo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Go)).length){0;var r=this.mode;0;var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=Ho(o);if(!i)return o;if(this._leaving)return Wo(e,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:l(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=Ko(this),u=this._vnode,c=Ho(u);if(i.data.directives&&i.data.directives.some(Zo)&&(i.data.show=!0),c&&c.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,c)&&!vt(c)&&(!c.componentInstance||!c.componentInstance._vnode.isComment)){var f=c.data.transition=T({},s);if("out-in"===r)return this._leaving=!0,Ke(f,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),Wo(e,o);if("in-out"===r){if(vt(i))return u;var p,d=function(){p()};Ke(s,"afterEnter",d),Ke(s,"enterCancelled",d),Ke(f,"delayLeave",(function(e){p=e}))}}return o}}},Qo=T({tag:String,moveClass:String},Vo);function Yo(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function ei(e){e.data.newPos=e.elm.getBoundingClientRect()}function ti(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,o=t.top-n.top;if(r||o){e.data.moved=!0;var i=e.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete Qo.mode;var ni={Transition:Xo,TransitionGroup:{props:Qo,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=Xt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Ko(this),s=0;s-1?yr[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:yr[e]=/HTMLUnknownElement/.test(t.toString())},T(Kn.options.directives,qo),T(Kn.options.components,ni),Kn.prototype.__patch__=G?Ro:R,Kn.prototype.$mount=function(e,t){return function(e,t,n){var r;e.$el=t,e.$options.render||(e.$options.render=ve),en(e,"beforeMount"),r=function(){e._update(e._render(),n)},new Vt(e,r,R,{before:function(){e._isMounted&&!e._isDestroyed&&en(e,"beforeUpdate")}},!0),n=!1;var o=e._preWatchers;if(o)for(var i=0;i=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(o.path||""),u=t&&t.path||"/",c=l.path?ji(l.path,u,n||o.append):u,f=function(e,t,n){void 0===t&&(t={});var r,o=n||ci;try{r=o(e||"")}catch(e){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(ui):ui(a)}return r}(l.query,o.query,r&&r.options.parseQuery),p=o.hash||l.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:c,query:f,hash:p}}var qi,Vi=function(){},Hi={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,l={},u=n.options.linkActiveClass,c=n.options.linkExactActiveClass,f=null==u?"router-link-active":u,p=null==c?"router-link-exact-active":c,d=null==this.activeClass?f:this.activeClass,v=null==this.exactActiveClass?p:this.exactActiveClass,h=a.redirectedFrom?di(null,Bi(a.redirectedFrom),null,n):a;l[v]=yi(r,h,this.exactPath),l[d]=this.exact||this.exactPath?l[v]:function(e,t){return 0===e.path.replace(pi,"/").indexOf(t.path.replace(pi,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,h);var m=l[v]?this.ariaCurrentValue:null,g=function(e){Ki(e)&&(t.replace?n.replace(i,Vi):n.push(i,Vi))},y={click:Ki};Array.isArray(this.event)?this.event.forEach((function(e){y[e]=g})):y[this.event]=g;var b={class:l},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:g,isActive:l[d],isExactActive:l[v]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?e():e("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":m};else{var w=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Ji(c.path,s.params),l(c,s,a)}if(s.path){s.params={};for(var d=0;d-1}function ka(e,t){return ja(e)&&e._isRouter&&(null==t||e.type===t)}function Sa(e,t,n){var r=function(o){o>=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}function Oa(e){return function(t,n,r){var o=!1,i=0,a=null;Ca(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,i++;var l,u=Ea((function(t){var o;((o=t).__esModule||$a&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:qi.extend(t),n.components[s]=t,--i<=0&&r()})),c=Ea((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=ja(e)?e:new Error(t),r(a))}));try{l=e(u,c)}catch(e){c(e)}if(l)if("function"==typeof l.then)l.then(u,c);else{var f=l.component;f&&"function"==typeof f.then&&f.then(u,c)}}})),o||r()}}function Ca(e,t){return Pa(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Pa(e){return Array.prototype.concat.apply([],e)}var $a="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ea(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Aa=function(e,t){this.router=e,this.base=function(e){if(!e)if(Wi){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=hi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Ta(e,t,n,r){var o=Ca(e,(function(e,r,o,i){var a=function(e,t){"function"!=typeof e&&(e=qi.extend(e));return e.options[t]}(e,t);if(a)return Array.isArray(a)?a.map((function(e){return n(e,r,o,i)})):n(a,r,o,i)}));return Pa(r?o.reverse():o)}function La(e,t){if(t)return function(){return e.apply(t,arguments)}}Aa.prototype.listen=function(e){this.cb=e},Aa.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Aa.prototype.onError=function(e){this.errorCbs.push(e)},Aa.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&(ka(e,ya.redirected)&&i===hi||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Aa.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var i,a,s=function(e){!ka(e)&&ja(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},l=e.matched.length-1,u=o.matched.length-1;if(yi(e,o)&&l===u&&e.matched[l]===o.matched[u])return this.ensureURL(),e.hash&&aa(this.router,o,e,!1),s(((a=wa(i=o,e,ya.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var c=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=ha&&n;r&&this.listeners.push(ia());var o=function(){var n=e.current,o=Ma(e.base);e.current===hi&&o===e._startLocation||e.transitionTo(o,(function(e){r&&aa(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ma(ki(r.base+e.fullPath)),aa(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){ga(ki(r.base+e.fullPath)),aa(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ma(this.base)!==this.current.fullPath){var t=ki(this.base+this.current.fullPath);e?ma(t):ga(t)}},t.prototype.getCurrentLocation=function(){return Ma(this.base)},t}(Aa);function Ma(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf(ki(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Na=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Ma(e);if(!/^\/#/.test(t))return window.location.replace(ki(e+"/#"+t)),!0}(this.base)||Ia()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=ha&&t;n&&this.listeners.push(ia());var r=function(){var t=e.current;Ia()&&e.transitionTo(Da(),(function(r){n&&aa(e.router,r,t,!0),ha||za(r.fullPath)}))},o=ha?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Ua(e.fullPath),aa(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){za(e.fullPath),aa(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Da()!==t&&(e?Ua(t):za(t))},t.prototype.getCurrentLocation=function(){return Da()},t}(Aa);function Ia(){var e=Da();return"/"===e.charAt(0)||(za("/"+e),!1)}function Da(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Fa(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function Ua(e){ha?ma(Fa(e)):window.location.hash=e}function za(e){ha?ga(Fa(e)):window.location.replace(Fa(e))}var Ja=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){ka(e,ya.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Aa),Ba=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Xi(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!ha&&!1!==e.fallback,this.fallback&&(t="hash"),Wi||(t="abstract"),this.mode=t,t){case"history":this.history=new Ra(this,e.base);break;case"hash":this.history=new Na(this,e.base,this.fallback);break;case"abstract":this.history=new Ja(this,e.base);break;default:0}},qa={currentRoute:{configurable:!0}};Ba.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},qa.currentRoute.get=function(){return this.history&&this.history.current},Ba.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof Ra||n instanceof Na){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;ha&&o&&"fullPath"in e&&aa(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},Ba.prototype.beforeEach=function(e){return Ha(this.beforeHooks,e)},Ba.prototype.beforeResolve=function(e){return Ha(this.resolveHooks,e)},Ba.prototype.afterEach=function(e){return Ha(this.afterHooks,e)},Ba.prototype.onReady=function(e,t){this.history.onReady(e,t)},Ba.prototype.onError=function(e){this.history.onError(e)},Ba.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},Ba.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},Ba.prototype.go=function(e){this.history.go(e)},Ba.prototype.back=function(){this.go(-1)},Ba.prototype.forward=function(){this.go(1)},Ba.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},Ba.prototype.resolve=function(e,t,n){var r=Bi(e,t=t||this.history.current,n,this),o=this.match(r,t),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?ki(e+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Ba.prototype.getRoutes=function(){return this.matcher.getRoutes()},Ba.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},Ba.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==hi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Ba.prototype,qa);var Va=Ba;function Ha(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}Ba.install=function e(t){if(!e.installed||qi!==t){e.installed=!0,qi=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",wi),t.component("RouterLink",Hi);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Ba.version="3.6.5",Ba.isNavigationFailure=ka,Ba.NavigationFailureType=ya,Ba.START_LOCATION=hi,Wi&&window.Vue&&window.Vue.use(Ba);n(95);n(122),n(88);var Ka={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,372)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,254)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(40)]).then(n.bind(null,241)),"components/Home":()=>Promise.all([n.e(0),n.e(19)]).then(n.bind(null,299)),"components/NavLink":()=>n.e(42).then(n.bind(null,240)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,265)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,369)),"components/Page":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,300)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,255)),"components/PageNav":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,267)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,301)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(41)]).then(n.bind(null,302)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,266)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(24)]).then(n.bind(null,256)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,253)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,390)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,373)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,374)),"layouts/404":()=>n.e(7).then(n.bind(null,375)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,376)),NotFound:()=>n.e(7).then(n.bind(null,375)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,376))},Wa={"v-2216e8dc":()=>n.e(10).then(n.bind(null,391)),"v-0b4d4089":()=>n.e(44).then(n.bind(null,392)),"v-094b9dee":()=>n.e(45).then(n.bind(null,393)),"v-7eb94829":()=>n.e(46).then(n.bind(null,394)),"v-51aaf849":()=>n.e(48).then(n.bind(null,395)),"v-29ebca8e":()=>n.e(47).then(n.bind(null,396)),"v-126ea6be":()=>n.e(49).then(n.bind(null,397)),"v-003ee409":()=>n.e(50).then(n.bind(null,398)),"v-4d7f1c8a":()=>n.e(51).then(n.bind(null,399)),"v-49301ee2":()=>n.e(53).then(n.bind(null,400)),"v-83a41dee":()=>n.e(52).then(n.bind(null,401)),"v-d1f646ae":()=>n.e(54).then(n.bind(null,402)),"v-464fd629":()=>n.e(55).then(n.bind(null,403)),"v-7cca31fe":()=>n.e(56).then(n.bind(null,404)),"v-76cafeae":()=>n.e(58).then(n.bind(null,405)),"v-f3391bf6":()=>n.e(59).then(n.bind(null,406)),"v-62aa1369":()=>n.e(60).then(n.bind(null,407)),"v-b5351e9e":()=>n.e(57).then(n.bind(null,408)),"v-3ad539ae":()=>n.e(61).then(n.bind(null,409)),"v-5e92fa09":()=>n.e(62).then(n.bind(null,410)),"v-48953121":()=>n.e(64).then(n.bind(null,411)),"v-1f38ca2e":()=>n.e(65).then(n.bind(null,412)),"v-8de1af1a":()=>n.e(63).then(n.bind(null,413)),"v-1dfe032e":()=>n.e(66).then(n.bind(null,414)),"v-27531941":()=>n.e(67).then(n.bind(null,415)),"v-c918a5fa":()=>n.e(69).then(n.bind(null,416)),"v-67c77489":()=>n.e(68).then(n.bind(null,417)),"v-5a94ae89":()=>n.e(70).then(n.bind(null,418)),"v-2abeb1ab":()=>n.e(71).then(n.bind(null,419)),"v-506a67bc":()=>n.e(73).then(n.bind(null,420)),"v-959a2c2e":()=>n.e(72).then(n.bind(null,421)),"v-7bf93309":()=>n.e(74).then(n.bind(null,422)),"v-07fb5e62":()=>n.e(75).then(n.bind(null,423)),"v-19f2c039":()=>n.e(76).then(n.bind(null,424)),"v-b99d2c2e":()=>n.e(77).then(n.bind(null,425)),"v-6731dec1":()=>n.e(78).then(n.bind(null,426)),"v-bf7e876e":()=>n.e(80).then(n.bind(null,427)),"v-bb53a316":()=>n.e(81).then(n.bind(null,428)),"v-7f55ccc9":()=>n.e(79).then(n.bind(null,429)),"v-20f55eeb":()=>n.e(82).then(n.bind(null,430)),"v-74774829":()=>n.e(83).then(n.bind(null,431)),"v-90fdf4e6":()=>n.e(84).then(n.bind(null,432)),"v-114a7465":()=>n.e(85).then(n.bind(null,433))};function Ga(e){const t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}const Za=/-(\w)/g,Xa=Ga(e=>e.replace(Za,(e,t)=>t?t.toUpperCase():"")),Qa=/\B([A-Z])/g,Ya=Ga(e=>e.replace(Qa,"-$1").toLowerCase()),es=Ga(e=>e.charAt(0).toUpperCase()+e.slice(1));function ts(e,t){if(!t)return;if(e(t))return e(t);return t.includes("-")?e(es(Xa(t))):e(es(t))||e(Ya(t))}const ns=Object.assign({},Ka,Wa),rs=e=>ns[e],os=e=>Wa[e],is=e=>Ka[e],as=e=>Kn.component(e);function ss(e){return ts(os,e)}function ls(e){return ts(is,e)}function us(e){return ts(rs,e)}function cs(e){return ts(as,e)}function fs(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!cs(e)&&us(e)){const t=await us(e)();Kn.component(e,t.default)}}))}function ps(e,t){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[e]=t)}var ds=n(86),vs=n.n(ds),hs=n(87),ms=n.n(hs),gs={created(){if(this.siteMeta=this.$site.headTags.filter(([e])=>"meta"===e).map(([e,t])=>t),this.$ssrContext){const t=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(e=t)?e.map(e=>{let t="{t+=` ${n}="${ms()(e[n])}"`}),t+">"}).join("\n "):"",this.$ssrContext.canonicalLink=bs(this.$canonicalUrl)}var e},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.getMergedMetaTags();this.currentMetaTags=_s(e,this.currentMetaTags)},getMergedMetaTags(){const e=this.$page.frontmatter.meta||[];return vs()([{name:"description",content:this.$description}],e,this.siteMeta,ws)},updateCanonicalLink(){ys(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",bs(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){_s(null,this.currentMetaTags),ys()}};function ys(){const e=document.querySelector("link[rel='canonical']");e&&e.remove()}function bs(e=""){return e?``:""}function _s(e,t){if(t&&[...t].filter(e=>e.parentNode===document.head).forEach(e=>document.head.removeChild(e)),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}function ws(e){for(const t of["name","property","itemprop"])if(e.hasOwnProperty(t))return e[t]+t;return JSON.stringify(e)}var xs=n(22),js=n.n(xs),ks=[gs,{mounted(){js.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||Kn.component(e.name)||js.a.start(),n()}),this.$router.afterEach(()=>{js.a.done(),this.isSidebarOpen=!1})}}],Ss={name:"GlobalLayout",computed:{layout(){const e=this.getLayout();return ps("layout",e),Kn.component(e)}},methods:{getLayout(){if(this.$page.path){const e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Os=n(14),Cs=Object(Os.a)(Ss,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),e[t].push(...n);break;default:throw new Error("Unknown option name.")}}(Cs,"mixins",ks);const Ps=[{name:"v-2216e8dc",path:"/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-2216e8dc").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-0b4d4089",path:"/api.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-0b4d4089").then(n)}},{name:"v-094b9dee",path:"/code_of_conduct/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-094b9dee").then(n)}},{path:"/code_of_conduct/index.html",redirect:"/code_of_conduct/"},{path:"/code_of_conduct.html",redirect:"/code_of_conduct/"},{name:"v-7eb94829",path:"/codegen.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7eb94829").then(n)}},{name:"v-51aaf849",path:"/components.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-51aaf849").then(n)}},{name:"v-29ebca8e",path:"/coercion.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-29ebca8e").then(n)}},{name:"v-126ea6be",path:"/contributing/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-126ea6be").then(n)}},{path:"/contributing/index.html",redirect:"/contributing/"},{path:"/contributing.html",redirect:"/contributing/"},{name:"v-003ee409",path:"/faq.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-003ee409").then(n)}},{name:"v-4d7f1c8a",path:"/guide/async-validation.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-4d7f1c8a").then(n)}},{name:"v-49301ee2",path:"/guide/environments.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-49301ee2").then(n)}},{name:"v-83a41dee",path:"/guide/combining-schemas.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-83a41dee").then(n)}},{name:"v-d1f646ae",path:"/guide/formats.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-d1f646ae").then(n)}},{name:"v-464fd629",path:"/guide/getting-started.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-464fd629").then(n)}},{name:"v-7cca31fe",path:"/guide/managing-schemas.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7cca31fe").then(n)}},{name:"v-76cafeae",path:"/guide/schema-language.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-76cafeae").then(n)}},{name:"v-f3391bf6",path:"/guide/typescript.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-f3391bf6").then(n)}},{name:"v-62aa1369",path:"/guide/user-keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-62aa1369").then(n)}},{name:"v-b5351e9e",path:"/guide/modifying-data.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-b5351e9e").then(n)}},{name:"v-3ad539ae",path:"/guide/why-ajv.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-3ad539ae").then(n)}},{name:"v-5e92fa09",path:"/json-schema.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-5e92fa09").then(n)}},{name:"v-48953121",path:"/keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-48953121").then(n)}},{name:"v-1f38ca2e",path:"/license.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-1f38ca2e").then(n)}},{name:"v-8de1af1a",path:"/json-type-definition.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-8de1af1a").then(n)}},{name:"v-1dfe032e",path:"/news/2020-08-14-mozilla-grant-openjs-foundation.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-1dfe032e").then(n)}},{name:"v-27531941",path:"/news/2020-12-15-ajv-version-7-released.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-27531941").then(n)}},{name:"v-c918a5fa",path:"/news/2021-03-27-ajv-version-8-released.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-c918a5fa").then(n)}},{name:"v-67c77489",path:"/news/2021-03-07-ajv-supports-json-type-definition.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-67c77489").then(n)}},{name:"v-5a94ae89",path:"/news/2021-04-24-ajv-online-event.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-5a94ae89").then(n)}},{name:"v-2abeb1ab",path:"/news/2021-05-24-ajv-online-event-video.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-2abeb1ab").then(n)}},{name:"v-506a67bc",path:"/news/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-506a67bc").then(n)}},{path:"/news/index.html",redirect:"/news/"},{name:"v-959a2c2e",path:"/news/2021-07-22-ajv-microsoft-foss-fund-award.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-959a2c2e").then(n)}},{name:"v-7bf93309",path:"/options.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7bf93309").then(n)}},{name:"v-07fb5e62",path:"/packages/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-07fb5e62").then(n)}},{path:"/packages/index.html",redirect:"/packages/"},{name:"v-19f2c039",path:"/packages/ajv-cli.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-19f2c039").then(n)}},{name:"v-b99d2c2e",path:"/packages/ajv-errors.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-b99d2c2e").then(n)}},{name:"v-6731dec1",path:"/packages/ajv-formats.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-6731dec1").then(n)}},{name:"v-bf7e876e",path:"/packages/ajv-keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-bf7e876e").then(n)}},{name:"v-bb53a316",path:"/security.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-bb53a316").then(n)}},{name:"v-7f55ccc9",path:"/packages/ajv-i18n.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7f55ccc9").then(n)}},{name:"v-20f55eeb",path:"/standalone.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-20f55eeb").then(n)}},{name:"v-74774829",path:"/strict-mode.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-74774829").then(n)}},{name:"v-90fdf4e6",path:"/testimonials.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-90fdf4e6").then(n)}},{name:"v-114a7465",path:"/v6-to-v8-migration.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-114a7465").then(n)}},{path:"*",component:Cs}],$s={title:"Ajv JSON schema validator",description:"The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927)",base:"/",headTags:[["link",{rel:"icon",href:"/favicon.ico"}],["meta",{charset:"utf-8"}],["meta",{property:"og:title",content:"Ajv JSON schema validator"}],["meta",{property:"og:description",content:"The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927)"}],["meta",{property:"og:image",content:"https://ajv.js.org/img/ajv.png"}],["meta",{itemprop:"image",content:"https://ajv.js.org/img/ajv.png"}],["meta",{name:"twitter:card",content:"summary"}],["meta",{name:"twitter:title",content:"Ajv JSON schema validator"}],["meta",{name:"twitter:image:src",content:"https://ajv.js.org/img/ajv.png"}],["meta",{name:"apple-mobile-web-app-capable",content:"yes"}],["link",{rel:"apple-touch-icon",href:"/img/apple-touch-icon.png"}]],pages:[{frontmatter:{homepage:!0,sidebar:!1},regularPath:"/",relativePath:"README.md",key:"v-2216e8dc",path:"/",headers:[{level:2,title:"Security and reliability for JavaScript applications",slug:"security-and-reliability-for-javascript-applications"},{level:3,title:"Write less code",slug:"write-less-code"},{level:3,title:"Super fast & secure",slug:"super-fast-secure"},{level:3,title:"Multi-standard",slug:"multi-standard"},{level:2,title:"Ajv sponsors",slug:"ajv-sponsors"},{level:2,title:"What users say",slug:"what-users-say"},{level:2,title:"News",slug:"news"},{level:2,title:"Who uses Ajv",slug:"who-uses-ajv"},{level:2,title:"Contributors",slug:"contributors"}]},{title:"API Reference",frontmatter:{},regularPath:"/api.html",relativePath:"api.md",key:"v-0b4d4089",path:"/api.html",headers:[{level:2,title:"Ajv constructor and methods",slug:"ajv-constructor-and-methods"},{level:3,title:"new Ajv(options: object)",slug:"new-ajv-options-object"},{level:3,title:"ajv.compile(schema: object): (data: any) => boolean | Promise",slug:"ajv-compile-schema-object-data-any-boolean-promise-any"},{level:3,title:"ajv.compileSerializer(schema: object): (data: any) => string",slug:"ajv-compileserializer-schema-object-data-any-string"},{level:3,title:"ajv.compileParser(schema: object): (json: string) => any",slug:"ajv-compileparser-schema-object-json-string-any"},{level:3,title:"ajv.compileAsync(schema: object, meta?: boolean): Promise",slug:"ajv-compileasync-schema-object-meta-boolean-promise-function"},{level:3,title:"ajv.validate(schemaOrRef: object | string, data: any): boolean",slug:"ajv-validate-schemaorref-object-string-data-any-boolean"},{level:3,title:"ajv.addSchema(schema: object | object[], key?: string): Ajv",slug:"ajv-addschema-schema-object-object-key-string-ajv"},{level:3,title:"ajv.addMetaSchema(schema: object | object[], key?: string): Ajv",slug:"ajv-addmetaschema-schema-object-object-key-string-ajv"},{level:3,title:"ajv.validateSchema(schema: object): boolean",slug:"ajv-validateschema-schema-object-boolean"},{level:3,title:"ajv.getSchema(key: string): undefined | ((data: any) => boolean | Promise )",slug:"ajv-getschema-key-string-undefined-data-any-boolean-promise-any"},{level:3,title:"ajv.removeSchema(schemaOrRef: object | string | RegExp): Ajv",slug:"ajv-removeschema-schemaorref-object-string-regexp-ajv"},{level:3,title:"ajv.addFormat(name: string, format: Format): Ajv",slug:"ajv-addformat-name-string-format-format-ajv"},{level:3,title:"ajv.addKeyword(definition: string | object): Ajv",slug:"ajv-addkeyword-definition-string-object-ajv"},{level:3,title:"ajv.getKeyword(keyword: string): object | boolean",slug:"ajv-getkeyword-keyword-string-object-boolean"},{level:3,title:"ajv.removeKeyword(keyword: string): Ajv",slug:"ajv-removekeyword-keyword-string-ajv"},{level:3,title:"ajv.errorsText(errors?: object[], options?: object): string",slug:"ajv-errorstext-errors-object-options-object-string"},{level:2,title:"Validation errors",slug:"validation-errors"},{level:3,title:"Error objects",slug:"error-objects"},{level:3,title:"Error parameters",slug:"error-parameters"},{level:3,title:"Errors i18n",slug:"errors-i18n"},{level:3,title:"Error logging",slug:"error-logging"}]},{title:"Contributor Covenant Code of Conduct",frontmatter:{permalink:"/code_of_conduct"},regularPath:"/code_of_conduct.html",relativePath:"code_of_conduct.md",key:"v-094b9dee",path:"/code_of_conduct/",headers:[{level:3,title:"Our Pledge",slug:"our-pledge"},{level:3,title:"Our Standards",slug:"our-standards"},{level:3,title:"Our Responsibilities",slug:"our-responsibilities"},{level:3,title:"Scope",slug:"scope"},{level:3,title:"Enforcement",slug:"enforcement"},{level:3,title:"Attribution",slug:"attribution"}]},{title:"Code generation design",frontmatter:{},regularPath:"/codegen.html",relativePath:"codegen.md",key:"v-7eb94829",path:"/codegen.html",headers:[{level:2,title:"Safe code generation",slug:"safe-code-generation"},{level:2,title:"Code optimization",slug:"code-optimization"},{level:2,title:"User-defined keywords",slug:"user-defined-keywords"}]},{title:"Code components",frontmatter:{},regularPath:"/components.html",relativePath:"components.md",key:"v-51aaf849",path:"/components.html",headers:[{level:2,title:"Ajv classes",slug:"ajv-classes"},{level:2,title:"Schema compilation",slug:"schema-compilation"},{level:2,title:"Other components",slug:"other-components"}]},{title:"Type coercion rules",frontmatter:{},regularPath:"/coercion.html",relativePath:"coercion.md",key:"v-29ebca8e",path:"/coercion.html",headers:[{level:2,title:"Coercion from string values",slug:"coercion-from-string-values"},{level:2,title:"Coercion from number values",slug:"coercion-from-number-values"},{level:2,title:"Coercion from boolean values",slug:"coercion-from-boolean-values"},{level:2,title:"Coercion from null",slug:"coercion-from-null"},{level:2,title:"Coercion to and from array",slug:"coercion-to-and-from-array"}]},{title:"Contributing guide",frontmatter:{permalink:"/contributing"},regularPath:"/contributing.html",relativePath:"contributing.md",key:"v-126ea6be",path:"/contributing/",headers:[{level:2,title:"Documentation",slug:"documentation"},{level:2,title:"Issues",slug:"issues"},{level:3,title:"Bug reports",slug:"bug-reports"},{level:3,title:"Security vulnerabilities",slug:"security-vulnerabilities"},{level:3,title:"Change proposals",slug:"change-proposals"},{level:3,title:"Browser and compatibility issues",slug:"browser-and-compatibility-issues"},{level:3,title:"Installation and dependency issues",slug:"installation-and-dependency-issues"},{level:3,title:"Using JSON Schema standard",slug:"using-json-schema-standard"},{level:3,title:"Ajv usage questions",slug:"ajv-usage-questions"},{level:2,title:"Code",slug:"code"},{level:3,title:"How we make decisions",slug:"how-we-make-decisions"},{level:3,title:"Development",slug:"development"},{level:3,title:"Pull requests",slug:"pull-requests"},{level:3,title:"Contributions license",slug:"contributions-license"}]},{title:"Frequently Asked Questions",frontmatter:{},regularPath:"/faq.html",relativePath:"faq.md",key:"v-003ee409",path:"/faq.html",headers:[{level:2,title:"Using JSON schema",slug:"using-json-schema"},{level:2,title:"Ajv API for returning validation errors",slug:"ajv-api-for-returning-validation-errors"},{level:2,title:"Additional properties inside compound keywords anyOf, oneOf, etc.",slug:"additional-properties-inside-compound-keywords-anyof-oneof-etc"},{level:2,title:"Generating schemas with resolved references ($ref)",slug:"generating-schemas-with-resolved-references-ref"}]},{title:"Asynchronous validation",frontmatter:{},regularPath:"/guide/async-validation.html",relativePath:"guide/async-validation.md",key:"v-4d7f1c8a",path:"/guide/async-validation.html",headers:[{level:3,title:"Using transpilers",slug:"using-transpilers"}]},{title:"Execution environments",frontmatter:{},regularPath:"/guide/environments.html",relativePath:"guide/environments.md",key:"v-49301ee2",path:"/guide/environments.html",headers:[{level:2,title:"Server-side Node.js",slug:"server-side-node-js"},{level:2,title:"Short-lived environments",slug:"short-lived-environments"},{level:2,title:"Browsers",slug:"browsers"},{level:2,title:"ES5 environments",slug:"es5-environments"},{level:2,title:"CJS vs ESM exports",slug:"cjs-vs-esm-exports"},{level:2,title:"Other JavaScript environments",slug:"other-javascript-environments"},{level:2,title:"Command line interface",slug:"command-line-interface"}]},{title:"Combining schemas",frontmatter:{},regularPath:"/guide/combining-schemas.html",relativePath:"guide/combining-schemas.md",key:"v-83a41dee",path:"/guide/combining-schemas.html",headers:[{level:2,title:"Combining schemas with $ref",slug:"combining-schemas-with-ref"},{level:2,title:"Extending recursive schemas",slug:"extending-recursive-schemas"},{level:2,title:"$data reference",slug:"data-reference"},{level:2,title:"$merge and $patch keywords",slug:"merge-and-patch-keywords"}]},{title:"Format validation",frontmatter:{},regularPath:"/guide/formats.html",relativePath:"guide/formats.md",key:"v-d1f646ae",path:"/guide/formats.html",headers:[{level:2,title:"String formats",slug:"string-formats"},{level:2,title:"User-defined formats",slug:"user-defined-formats"},{level:2,title:"Formats and standalone validation code",slug:"formats-and-standalone-validation-code"}]},{title:"Getting started",frontmatter:{},regularPath:"/guide/getting-started.html",relativePath:"guide/getting-started.md",key:"v-464fd629",path:"/guide/getting-started.html",headers:[{level:2,title:"Install",slug:"install"},{level:2,title:"Basic data validation",slug:"basic-data-validation"},{level:2,title:"Parsing and serializing JSON",slug:"parsing-and-serializing-json"}]},{title:"Managing schemas",frontmatter:{},regularPath:"/guide/managing-schemas.html",relativePath:"guide/managing-schemas.md",key:"v-7cca31fe",path:"/guide/managing-schemas.html",headers:[{level:2,title:"Re-using validation functions",slug:"re-using-validation-functions"},{level:2,title:"Standalone validation code",slug:"standalone-validation-code"},{level:2,title:"Compiling during initialization",slug:"compiling-during-initialization"},{level:2,title:"Using Ajv instance cache",slug:"using-ajv-instance-cache"},{level:3,title:"Cache key: schema vs key vs $id",slug:"cache-key-schema-vs-key-vs-id"},{level:3,title:"Pre-adding all schemas vs adding on demand",slug:"pre-adding-all-schemas-vs-adding-on-demand"},{level:3,title:"Asynchronous schema loading",slug:"asynchronous-schema-loading"},{level:2,title:"Caching schemas in your code",slug:"caching-schemas-in-your-code"}]},{title:"Choosing schema language",frontmatter:{tags:["JTD"]},regularPath:"/guide/schema-language.html",relativePath:"guide/schema-language.md",key:"v-76cafeae",path:"/guide/schema-language.html",headers:[{level:2,title:"JSON Type Definition",slug:"json-type-definition"},{level:2,title:"JSON Schema",slug:"json-schema"},{level:3,title:"draft-04",slug:"draft-04"},{level:3,title:"draft-07 (and draft-06)",slug:"draft-07-and-draft-06"},{level:3,title:"draft 2019-09 (and draft-2020-12)",slug:"draft-2019-09-and-draft-2020-12"},{level:2,title:"Comparison",slug:"comparison"},{level:3,title:"JSON Schema",slug:"json-schema-2"},{level:3,title:"JSON Type Definition",slug:"json-type-definition-2"}]},{title:"Using with TypeScript",frontmatter:{},regularPath:"/guide/typescript.html",relativePath:"guide/typescript.md",key:"v-f3391bf6",path:"/guide/typescript.html",headers:[{level:2,title:"Additional functionality",slug:"additional-functionality"},{level:2,title:"Utility types for schemas",slug:"utility-types-for-schemas"},{level:2,title:"Utility type for JTD data type",slug:"utility-type-for-jtd-data-type"},{level:2,title:"Type-safe error handling",slug:"type-safe-error-handling"},{level:2,title:"Type-safe parsers and serializers",slug:"type-safe-parsers-and-serializers"},{level:2,title:"Type-safe unions",slug:"type-safe-unions"}]},{title:"User-defined keywords",frontmatter:{},regularPath:"/guide/user-keywords.html",relativePath:"guide/user-keywords.md",key:"v-62aa1369",path:"/guide/user-keywords.html"},{title:"Modifying data during validation",frontmatter:{},regularPath:"/guide/modifying-data.html",relativePath:"guide/modifying-data.md",key:"v-b5351e9e",path:"/guide/modifying-data.html",headers:[{level:2,title:"General considerations",slug:"general-considerations"},{level:2,title:"Removing additional properties",slug:"removing-additional-properties"},{level:2,title:"Assigning defaults",slug:"assigning-defaults"},{level:2,title:"Coercing data types",slug:"coercing-data-types"}]},{title:"Why use AJV",frontmatter:{},regularPath:"/guide/why-ajv.html",relativePath:"guide/why-ajv.md",key:"v-3ad539ae",path:"/guide/why-ajv.html",headers:[{level:2,title:"Write less code",slug:"write-less-code"},{level:2,title:"Super fast & secure",slug:"super-fast-secure"},{level:2,title:"Multi-standard",slug:"multi-standard"}]},{title:"JSON Schema",frontmatter:{},regularPath:"/json-schema.html",relativePath:"json-schema.md",key:"v-5e92fa09",path:"/json-schema.html",headers:[{level:2,title:"JSON Schema versions",slug:"json-schema-versions"},{level:3,title:"draft-07",slug:"draft-07"},{level:3,title:"draft-2019-09",slug:"draft-2019-09"},{level:3,title:"draft-2020-12",slug:"draft-2020-12"},{level:3,title:"draft-06",slug:"draft-06"},{level:3,title:"draft-04",slug:"draft-04"},{level:2,title:"OpenAPI support",slug:"openapi-support"},{level:2,title:"JSON data type",slug:"json-data-type"},{level:3,title:"type",slug:"type"},{level:3,title:"nullable",slug:"nullable"},{level:2,title:"Keywords for numbers",slug:"keywords-for-numbers"},{level:3,title:"maximum / minimum and exclusiveMaximum / exclusiveMinimum",slug:"maximum-minimum-and-exclusivemaximum-exclusiveminimum"},{level:3,title:"multipleOf",slug:"multipleof"},{level:2,title:"Keywords for strings",slug:"keywords-for-strings"},{level:3,title:"maxLength / minLength",slug:"maxlength-minlength"},{level:3,title:"pattern",slug:"pattern"},{level:3,title:"format",slug:"format"},{level:2,title:"Keywords for arrays",slug:"keywords-for-arrays"},{level:3,title:"maxItems / minItems",slug:"maxitems-minitems"},{level:3,title:"uniqueItems",slug:"uniqueitems"},{level:3,title:"items",slug:"items"},{level:3,title:"prefixItems",slug:"prefixitems"},{level:3,title:"additionalItems",slug:"additionalitems"},{level:3,title:"contains",slug:"contains"},{level:3,title:"maxContains / minContains",slug:"maxcontains-mincontains"},{level:3,title:"unevaluatedItems",slug:"unevaluateditems"},{level:2,title:"Keywords for objects",slug:"keywords-for-objects"},{level:3,title:"maxProperties / minProperties",slug:"maxproperties-minproperties"},{level:3,title:"required",slug:"required"},{level:3,title:"properties",slug:"properties"},{level:3,title:"patternProperties",slug:"patternproperties"},{level:3,title:"additionalProperties",slug:"additionalproperties"},{level:3,title:"dependencies",slug:"dependencies"},{level:3,title:"dependentRequired",slug:"dependentrequired"},{level:3,title:"dependentSchemas",slug:"dependentschemas"},{level:3,title:"propertyNames",slug:"propertynames"},{level:3,title:"unevaluatedProperties",slug:"unevaluatedproperties"},{level:3,title:"discriminator",slug:"discriminator"},{level:2,title:"Keywords for all types",slug:"keywords-for-all-types"},{level:3,title:"enum",slug:"enum"},{level:3,title:"const",slug:"const"},{level:2,title:"Compound keywords",slug:"compound-keywords"},{level:3,title:"not",slug:"not"},{level:3,title:"oneOf",slug:"oneof"},{level:3,title:"anyOf",slug:"anyof"},{level:3,title:"allOf",slug:"allof"},{level:3,title:"if/then/else",slug:"if-then-else"},{level:2,title:"Metadata keywords",slug:"metadata-keywords"}]},{title:"User defined keywords",frontmatter:{},regularPath:"/keywords.html",relativePath:"keywords.md",key:"v-48953121",path:"/keywords.html",headers:[{level:2,title:"Common attributes of keyword definitions",slug:"common-attributes-of-keyword-definitions"},{level:3,title:"Define keyword with code generation function",slug:"define-keyword-with-code-generation-function"},{level:3,title:'Define keyword with "validate" function',slug:"define-keyword-with-validate-function"},{level:3,title:'Define keyword with "compile" function',slug:"define-keyword-with-compile-function"},{level:3,title:'Define keyword with "macro" function',slug:"define-keyword-with-macro-function"},{level:2,title:"Schema compilation context",slug:"schema-compilation-context"},{level:2,title:"Validation time variables",slug:"validation-time-variables"},{level:2,title:"Reporting errors",slug:"reporting-errors"}]},{frontmatter:{},regularPath:"/license.html",relativePath:"license.md",key:"v-1f38ca2e",path:"/license.html"},{title:"JSON Type Definition",frontmatter:{},regularPath:"/json-type-definition.html",relativePath:"json-type-definition.md",key:"v-8de1af1a",path:"/json-type-definition.html",headers:[{level:2,title:"JTD schema forms",slug:"jtd-schema-forms"},{level:3,title:"Type form",slug:"type-form"},{level:3,title:"Enum form",slug:"enum-form"},{level:3,title:"Elements form",slug:"elements-form"},{level:3,title:"Properties form",slug:"properties-form"},{level:3,title:"Discriminator form",slug:"discriminator-form"},{level:3,title:"Values form",slug:"values-form"},{level:3,title:"Ref form",slug:"ref-form"},{level:3,title:"Empty form",slug:"empty-form"},{level:2,title:"JTDSchemaType",slug:"jtdschematype"},{level:3,title:"Most Schemas",slug:"most-schemas"},{level:3,title:"Ref Schemas",slug:"ref-schemas"},{level:3,title:"Notable Omissions",slug:"notable-omissions"},{level:2,title:"Extending JTD",slug:"extending-jtd"},{level:3,title:"Metadata schema member",slug:"metadata-schema-member"},{level:3,title:"Union keyword",slug:"union-keyword"},{level:3,title:"User-defined keywords",slug:"user-defined-keywords"},{level:2,title:"Validation errors",slug:"validation-errors"}]},{title:"Mozilla MOSS grant and OpenJS Foundation",frontmatter:{news:!0,title:"Mozilla MOSS grant and OpenJS Foundation",date:"2020-08-14T00:00:00.000Z"},regularPath:"/news/2020-08-14-mozilla-grant-openjs-foundation.html",relativePath:"news/2020-08-14-mozilla-grant-openjs-foundation.md",key:"v-1dfe032e",path:"/news/2020-08-14-mozilla-grant-openjs-foundation.html",excerpt:'\n

Ajv has been awarded a grant from Mozilla’s Open Source Support (MOSS) program in the “Foundational Technology” track! It will sponsor the development of Ajv support of JSON Schema version 2019-09 and of JSON Type Definition (RFC8927).

\n

Ajv also joined OpenJS Foundation – having this support will help ensure the longevity and stability of Ajv for all its users.

\n'},{title:"Ajv version 7 is released!",frontmatter:{news:!0,title:"Ajv version 7 is released!",date:"2020-12-15T00:00:00.000Z"},regularPath:"/news/2020-12-15-ajv-version-7-released.html",relativePath:"news/2020-12-15-ajv-version-7-released.md",key:"v-27531941",path:"/news/2020-12-15-ajv-version-7-released.html",excerpt:'

Ajv version 7 has these new features:

\n\n'},{title:"Ajv version 8 is released!",frontmatter:{news:!0,title:"Ajv version 8 is released!",date:"2021-03-27T00:00:00.000Z"},regularPath:"/news/2021-03-27-ajv-version-8-released.html",relativePath:"news/2021-03-27-ajv-version-8-released.md",key:"v-c918a5fa",path:"/news/2021-03-27-ajv-version-8-released.html",excerpt:'

Ajv version 8 has these new features:

\n\n'},{title:"Ajv supports JSON Type Definition",frontmatter:{news:!0,title:"Ajv supports JSON Type Definition",date:"2021-03-07T00:00:00.000Z"},regularPath:"/news/2021-03-07-ajv-supports-json-type-definition.html",relativePath:"news/2021-03-07-ajv-supports-json-type-definition.md",key:"v-67c77489",path:"/news/2021-03-07-ajv-supports-json-type-definition.html",excerpt:'

JSON Type Definition (JTD) is a new specification for defining JSON structures that is very simple to use, comparing with JSON Schema, less error prone, and it is published as RFC8927.

\n

See Choosing schema language for a detailed comparison between JSON Schema and JSON Type definition and informal specification.

\n'},{title:"Ajv online event - May 20, 10am PT / 6pm UK",frontmatter:{news:!0,title:"Ajv online event - May 20, 10am PT / 6pm UK",date:"2021-04-24T00:00:00.000Z",more:!1},regularPath:"/news/2021-04-24-ajv-online-event.html",relativePath:"news/2021-04-24-ajv-online-event.md",key:"v-5a94ae89",path:"/news/2021-04-24-ajv-online-event.html",excerpt:'

We will talk about:

\n
    \n
  • new features of Ajv version 8.
  • \n
  • the improvements sponsored by Mozilla\'s MOSS grant.
  • \n
  • how Ajv is used in JavaScript applications.
  • \n
\n

Speakers:

\n
    \n
  • Evgeny Poberezkin, the creator of Ajv.
  • \n
  • Mehan Jayasuriya, Program Officer at Mozilla Foundation, leading the MOSS and other programs investing in the open source and community ecosystems.
  • \n
  • Matteo Collina, Technical Director at NearForm and Node.js Technical Steering Committee member, creator of Fastify web framework.
  • \n
  • Kin Lane, Chief Evangelist at Postman. Studying the tech, business & politics of APIs since 2010. Presidential Innovation Fellow during the Obama administration.
  • \n
  • Ulysse Carion, the creator of JSON Type Definition specification.
  • \n
\n

Gajus Kuizinas will host the event.

\n

Please register here.

\n'},{title:"Ajv online event video uploaded",frontmatter:{news:!0,title:"Ajv online event video uploaded",date:"2021-05-24T00:00:00.000Z",more:!1},regularPath:"/news/2021-05-24-ajv-online-event-video.html",relativePath:"news/2021-05-24-ajv-online-event-video.md",key:"v-2abeb1ab",path:"/news/2021-05-24-ajv-online-event-video.html",excerpt:'

Huge thanks to everybody who joined, and to the speakers! The video of the event is available on YouTube.

\n'},{title:"Ajv News",frontmatter:{newsIndex:!0,editLink:!1},regularPath:"/news/",relativePath:"news/README.md",key:"v-506a67bc",path:"/news/"},{title:"Microsoft FOSS award",frontmatter:{news:!0,title:"Microsoft FOSS award",date:"2021-07-22T00:00:00.000Z",more:!1},regularPath:"/news/2021-07-22-ajv-microsoft-foss-fund-award.html",relativePath:"news/2021-07-22-ajv-microsoft-foss-fund-award.md",key:"v-959a2c2e",path:"/news/2021-07-22-ajv-microsoft-foss-fund-award.html",excerpt:'

Ajv was awarded a sponsorship from Microsoft FOSS fund - huge thanks to Microsoft and the engineers who voted to support Ajv development.

\n

This award will contribute to a long term maintenance of Ajv.

\n'},{title:"Ajv options",frontmatter:{},regularPath:"/options.html",relativePath:"options.md",key:"v-7bf93309",path:"/options.html",headers:[{level:2,title:"Usage",slug:"usage"},{level:2,title:"Option defaults",slug:"option-defaults"},{level:2,title:"Strict mode options",slug:"strict-mode-options"},{level:3,title:"strict",slug:"strict"},{level:3,title:"strictSchema",slug:"strictschema"},{level:3,title:"strictNumbers",slug:"strictnumbers"},{level:3,title:"strictTypes",slug:"stricttypes"},{level:3,title:"strictTuples",slug:"stricttuples"},{level:3,title:"strictRequired",slug:"strictrequired"},{level:3,title:"allowUnionTypes",slug:"allowuniontypes"},{level:3,title:"allowMatchingProperties",slug:"allowmatchingproperties"},{level:3,title:"validateFormats",slug:"validateformats"},{level:2,title:"Validation and reporting options",slug:"validation-and-reporting-options"},{level:3,title:"$data",slug:"data"},{level:3,title:"allErrors",slug:"allerrors"},{level:3,title:"verbose",slug:"verbose"},{level:3,title:"discriminator",slug:"discriminator"},{level:3,title:"unicodeRegExp",slug:"unicoderegexp"},{level:3,title:"timestamp",slug:"timestamp"},{level:3,title:"parseDate",slug:"parsedate"},{level:3,title:"allowDate",slug:"allowdate"},{level:3,title:"int32range",slug:"int32range"},{level:3,title:"$comment",slug:"comment"},{level:3,title:"formats",slug:"formats"},{level:3,title:"keywords",slug:"keywords"},{level:3,title:"schemas",slug:"schemas"},{level:3,title:"logger",slug:"logger"},{level:3,title:"loadSchema",slug:"loadschema"},{level:2,title:"Options to modify validated data",slug:"options-to-modify-validated-data"},{level:3,title:"removeAdditional",slug:"removeadditional"},{level:3,title:"useDefaults",slug:"usedefaults"},{level:3,title:"coerceTypes",slug:"coercetypes"},{level:2,title:"Advanced options",slug:"advanced-options"},{level:3,title:"meta",slug:"meta"},{level:3,title:"validateSchema",slug:"validateschema"},{level:3,title:"addUsedSchema",slug:"addusedschema"},{level:3,title:"inlineRefs",slug:"inlinerefs"},{level:3,title:"passContext",slug:"passcontext"},{level:3,title:"loopRequired",slug:"looprequired"},{level:3,title:"loopEnum",slug:"loopenum"},{level:3,title:"ownProperties",slug:"ownproperties"},{level:3,title:"multipleOfPrecision",slug:"multipleofprecision"},{level:3,title:"messages",slug:"messages"},{level:3,title:"uriResolver",slug:"uriresolver"},{level:3,title:"code",slug:"code"}]},{title:"Extending Ajv",frontmatter:{},regularPath:"/packages/",relativePath:"packages/README.md",key:"v-07fb5e62",path:"/packages/",headers:[{level:2,title:"Plugins",slug:"plugins"},{level:2,title:"Related packages",slug:"related-packages"}]},{frontmatter:{editLink:"https://github.com/ajv-validator/ajv-cli/edit/master/README.md"},regularPath:"/packages/ajv-cli.html",relativePath:"packages/ajv-cli.md",key:"v-19f2c039",path:"/packages/ajv-cli.html",headers:[{level:2,title:"Contents",slug:"contents"},{level:2,title:"Installation",slug:"installation"},{level:2,title:"JSON schema language and version",slug:"json-schema-language-and-version"},{level:2,title:"Commands",slug:"commands"},{level:3,title:"Help command",slug:"help-command"},{level:3,title:"Validate data",slug:"validate-data"},{level:3,title:"Compile schemas",slug:"compile-schemas"},{level:3,title:"Migrate schemas",slug:"migrate-schemas"},{level:3,title:"Test validation result",slug:"test-validation-result"},{level:2,title:"Ajv options",slug:"ajv-options"},{level:2,title:"Version History",slug:"version-history"},{level:2,title:"Licence",slug:"licence"}]},{frontmatter:{editLink:"https://github.com/ajv-validator/ajv-errors/edit/master/README.md"},regularPath:"/packages/ajv-errors.html",relativePath:"packages/ajv-errors.md",key:"v-b99d2c2e",path:"/packages/ajv-errors.html",headers:[{level:2,title:"Contents",slug:"contents"},{level:2,title:"Install",slug:"install"},{level:2,title:"Usage",slug:"usage"},{level:3,title:"Single message",slug:"single-message"},{level:3,title:"Messages for keywords",slug:"messages-for-keywords"},{level:3,title:"Messages for properties and items",slug:"messages-for-properties-and-items"},{level:3,title:"Default message",slug:"default-message"},{level:2,title:"Templates",slug:"templates"},{level:2,title:"Options",slug:"options"},{level:2,title:"Supporters",slug:"supporters"},{level:2,title:"Enterprise support",slug:"enterprise-support"},{level:2,title:"Security contact",slug:"security-contact"},{level:2,title:"License",slug:"license"}]},{frontmatter:{editLink:"https://github.com/ajv-validator/ajv-formats/edit/master/README.md"},regularPath:"/packages/ajv-formats.html",relativePath:"packages/ajv-formats.md",key:"v-6731dec1",path:"/packages/ajv-formats.html",headers:[{level:2,title:"Usage",slug:"usage"},{level:2,title:"Formats",slug:"formats"},{level:2,title:"Keywords to compare values: formatMaximum / formatMinimum and formatExclusiveMaximum / formatExclusiveMinimum",slug:"keywords-to-compare-values-formatmaximum-formatminimum-and-formatexclusivemaximum-formatexclusiveminimum"},{level:2,title:"Options",slug:"options"},{level:2,title:"Tests",slug:"tests"},{level:2,title:"License",slug:"license"}]},{frontmatter:{editLink:"https://github.com/ajv-validator/ajv-keywords/edit/master/README.md"},regularPath:"/packages/ajv-keywords.html",relativePath:"packages/ajv-keywords.md",key:"v-bf7e876e",path:"/packages/ajv-keywords.html",headers:[{level:2,title:"Contents",slug:"contents"},{level:2,title:"Install",slug:"install"},{level:2,title:"Usage",slug:"usage"},{level:2,title:"Keywords",slug:"keywords"},{level:3,title:"Types",slug:"types"},{level:3,title:"Keywords for numbers",slug:"keywords-for-numbers"},{level:3,title:"Keywords for strings",slug:"keywords-for-strings"},{level:3,title:"Keywords for arrays",slug:"keywords-for-arrays"},{level:3,title:"Keywords for objects",slug:"keywords-for-objects"},{level:3,title:"Keywords for all types",slug:"keywords-for-all-types"},{level:2,title:"Security contact",slug:"security-contact"},{level:2,title:"Open-source software support",slug:"open-source-software-support"},{level:2,title:"License",slug:"license"}]},{title:"Security considerations",frontmatter:{},regularPath:"/security.html",relativePath:"security.md",key:"v-bb53a316",path:"/security.html",headers:[{level:2,title:"Security contact",slug:"security-contact"},{level:2,title:"Untrusted schemas",slug:"untrusted-schemas"},{level:2,title:"Circular references in JavaScript objects",slug:"circular-references-in-javascript-objects"},{level:2,title:"Security risks of trusted schemas",slug:"security-risks-of-trusted-schemas"},{level:2,title:"ReDoS attack",slug:"redos-attack"},{level:2,title:"Content Security Policy",slug:"content-security-policy"}]},{frontmatter:{editLink:"https://github.com/ajv-validator/ajv-i18n/edit/master/README.md"},regularPath:"/packages/ajv-i18n.html",relativePath:"packages/ajv-i18n.md",key:"v-7f55ccc9",path:"/packages/ajv-i18n.html",headers:[{level:2,title:"Supported locales",slug:"supported-locales"},{level:2,title:"Install",slug:"install"},{level:2,title:"Usage",slug:"usage"},{level:2,title:"Tests",slug:"tests"},{level:2,title:"Contributing",slug:"contributing"},{level:2,title:"Contributors of locales",slug:"contributors-of-locales"},{level:2,title:"Enterprise support",slug:"enterprise-support"},{level:2,title:"Security contact",slug:"security-contact"},{level:2,title:"License",slug:"license"}]},{title:"Standalone validation code",frontmatter:{},regularPath:"/standalone.html",relativePath:"standalone.md",key:"v-20f55eeb",path:"/standalone.html",headers:[{level:2,title:"Two-step process",slug:"two-step-process"},{level:3,title:"Generating function(s) using CLI",slug:"generating-function-s-using-cli"},{level:3,title:"Generating using the JS library",slug:"generating-using-the-js-library"},{level:2,title:"Using the validation function(s)",slug:"using-the-validation-function-s"},{level:3,title:"Validating a single schemas using the JS library - ES6 and CJS",slug:"validating-a-single-schemas-using-the-js-library-es6-and-cjs"},{level:3,title:"Validating multiple schemas using the JS library - ES6 and CJS",slug:"validating-multiple-schemas-using-the-js-library-es6-and-cjs"},{level:3,title:"Validating multiple schemas using the JS library - ES6 and ESM",slug:"validating-multiple-schemas-using-the-js-library-es6-and-esm"},{level:3,title:"Requirement at runtime",slug:"requirement-at-runtime"},{level:2,title:"Configuration and limitations",slug:"configuration-and-limitations"}]},{title:"Strict mode",frontmatter:{},regularPath:"/strict-mode.html",relativePath:"strict-mode.md",key:"v-74774829",path:"/strict-mode.html",headers:[{level:2,title:"JSON Type Definition schemas",slug:"json-type-definition-schemas"},{level:2,title:"JSON Schema schemas",slug:"json-schema-schemas"},{level:3,title:"Prohibit ignored keywords",slug:"prohibit-ignored-keywords"},{level:3,title:"Prevent unexpected validation",slug:"prevent-unexpected-validation"},{level:3,title:"Strict types",slug:"strict-types"},{level:3,title:"Strict number validation",slug:"strict-number-validation"}]},{title:"What users say",frontmatter:{},regularPath:"/testimonials.html",relativePath:"testimonials.md",key:"v-90fdf4e6",path:"/testimonials.html"},{title:"Changes from Ajv v6.12.6 to v8.0.0",frontmatter:{},regularPath:"/v6-to-v8-migration.html",relativePath:"v6-to-v8-migration.md",key:"v-114a7465",path:"/v6-to-v8-migration.html",headers:[{level:2,title:"New features",slug:"new-features"},{level:2,title:"Better TypeScript support",slug:"better-typescript-support"},{level:2,title:"Potential migration difficulties",slug:"potential-migration-difficulties"},{level:2,title:"API changes",slug:"api-changes"},{level:3,title:"Added options",slug:"added-options"},{level:3,title:"Changed options",slug:"changed-options"},{level:3,title:"Removed options",slug:"removed-options"}]}],themeConfig:{logo:"/img/ajv.svg",nav:[{text:"Home",link:"/"},{text:"Guide",items:[{link:"/guide/why-ajv",text:"Why use Ajv"},{link:"/guide/getting-started",text:"Getting started"},{link:"/guide/typescript",text:"Using with TypeScript"},{link:"/guide/schema-language",text:"Choosing schema language"},{link:"/guide/managing-schemas",text:"Managing schemas"},{link:"/guide/combining-schemas",text:"Combining schemas"},{link:"/guide/formats",text:"Format validation"},{link:"/guide/modifying-data",text:"Modifying data"},{link:"/guide/user-keywords",text:"User-defined keywords"},{link:"/guide/async-validation",text:"Asynchronous validation"},{link:"/guide/environments",text:"Execution environments"}]},{text:"Reference",items:[{link:"/api",text:"API Reference"},{link:"/options",text:"Ajv options"},{link:"/json-schema",text:"JSON Schema"},{link:"/json-type-definition",text:"JSON Type Definition"},{link:"/strict-mode",text:"Strict mode"},{link:"/standalone",text:"Standalone validation code"},{link:"/keywords",text:"User defined keywords"},{link:"/coercion",text:"Type coercion rules"}]},{text:"Learn more",items:[{text:"Extending Ajv",items:[{link:"/packages/",text:"Extending Ajv"},{link:"/packages/ajv-cli",text:"ajv-cli"},{link:"/packages/ajv-errors",text:"ajv-errors"},{link:"/packages/ajv-formats",text:"ajv-formats"},{link:"/packages/ajv-i18n",text:"ajv-i18n"},{link:"/packages/ajv-keywords",text:"ajv-keywords"}]},{text:"Contributors",items:[{link:"/contributing",text:"Contributing guide"},{link:"/codegen",text:"Code generation design"},{link:"/components",text:"Code components"},{link:"/code_of_conduct",text:"Code of Conduct"}]},{text:"Information",items:[{link:"/news/",text:"News"},{link:"/faq",text:"FAQ"},{link:"/security",text:"Security"},{link:"/v6-to-v8-migration",text:"Migrate from v6"},{link:"/testimonials",text:"What users say"},{link:"/license",text:"License"}]}]}],sidebar:[{title:"Guide",children:["/guide/why-ajv","/guide/getting-started","/guide/typescript","/guide/schema-language","/guide/managing-schemas","/guide/combining-schemas","/guide/formats","/guide/modifying-data","/guide/user-keywords","/guide/async-validation","/guide/environments"]},{title:"Reference",children:["/api","/options","/json-schema","/json-type-definition","/strict-mode","/standalone","/keywords","/coercion"]},{title:"Extending Ajv",children:[["/packages/","Extending Ajv"],["/packages/ajv-formats","ajv-formats"],["/packages/ajv-keywords","ajv-keywords"],["/packages/ajv-errors","ajv-errors"],["/packages/ajv-i18n","ajv-i18n"],["/packages/ajv-cli","ajv-cli"]]},{title:"Contributors",children:["/contributing","/codegen","/components",["/code_of_conduct","Code of conduct"]]},{title:"Information",children:["/news/","/faq","/security",["/v6-to-v8-migration","Migrate from v6 to v8"],"/testimonials",["/license","License"]]}],repo:"ajv-validator/ajv",docsDir:"docs",editLinks:!0,activeHeaderLinks:!1}};n(233);Kn.component("Button",()=>Promise.all([n.e(0),n.e(25)]).then(n.bind(null,377))),Kn.component("Column",()=>Promise.all([n.e(0),n.e(26)]).then(n.bind(null,378))),Kn.component("Columns",()=>Promise.all([n.e(0),n.e(27)]).then(n.bind(null,434))),Kn.component("Contributors",()=>Promise.all([n.e(0),n.e(21)]).then(n.bind(null,379))),Kn.component("Feature",()=>Promise.all([n.e(0),n.e(22)]).then(n.bind(null,380))),Kn.component("Features",()=>Promise.all([n.e(0),n.e(28)]).then(n.bind(null,435))),Kn.component("FooterColumn",()=>Promise.all([n.e(0),n.e(29)]).then(n.bind(null,381))),Kn.component("FooterColumns",()=>Promise.all([n.e(0),n.e(30)]).then(n.bind(null,436))),Kn.component("GitHub",()=>Promise.all([n.e(0),n.e(31)]).then(n.bind(null,382))),Kn.component("HeroSection",()=>Promise.all([n.e(0),n.e(23)]).then(n.bind(null,437))),Kn.component("HomePage",()=>Promise.all([n.e(0),n.e(32)]).then(n.bind(null,438))),Kn.component("HomeSection",()=>Promise.all([n.e(0),n.e(33)]).then(n.bind(null,383))),Kn.component("NewsHome",()=>Promise.all([n.e(0),n.e(34)]).then(n.bind(null,384))),Kn.component("NewsIndex",()=>n.e(43).then(n.bind(null,385))),Kn.component("NewsPost",()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,386))),Kn.component("NewsPostMeta",()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,387))),Kn.component("Projects",()=>Promise.all([n.e(0),n.e(35)]).then(n.bind(null,439))),Kn.component("Sponsors",()=>Promise.all([n.e(0),n.e(36)]).then(n.bind(null,388))),Kn.component("Subscribe",()=>Promise.all([n.e(0),n.e(37)]).then(n.bind(null,440))),Kn.component("Testimonial",()=>Promise.all([n.e(0),n.e(38)]).then(n.bind(null,389))),Kn.component("Testimonials",()=>Promise.all([n.e(0),n.e(39)]).then(n.bind(null,441))),Kn.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,390))),Kn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,373))),Kn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,374)));n(234);var Es=[{},({Vue:e})=>{e.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{}],As=[];class Ts extends class{constructor(){this.store=new Kn({data:{state:{}}})}$get(e){return this.store.state[e]}$set(e,t){Kn.set(this.store.state,e,t)}$emit(...e){this.store.$emit(...e)}$on(...e){this.store.$on(...e)}}{}Object.assign(Ts.prototype,{getPageAsyncComponent:ss,getLayoutAsyncComponent:ls,getAsyncComponent:us,getVueComponent:cs});var Ls={install(e){const t=new Ts;e.$vuepress=t,e.prototype.$vuepress=t}};function Rs(e,t){const n=t.toLowerCase();return e.options.routes.some(e=>e.path.toLowerCase()===n)}var Ms={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(e){const t=this.pageKey||this.$parent.$page.key;return ps("pageKey",t),Kn.component(t)||Kn.component(t,ss(t)),Kn.component(t)?e(t):e("")}},Ns={functional:!0,props:{slotKey:String,required:!0},render:(e,{props:t,slots:n})=>e("div",{class:["content__"+t.slotKey]},n()[t.slotKey])},Is={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},Ds=(n(235),n(236),Object(Os.a)(Is,(function(){var e=this._self._c;return e("span",[e("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[e("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),e("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),e("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),Fs={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};Kn.config.productionTip=!1,Kn.use(Va),Kn.use(Ls),Kn.mixin(function(e,t,n=Kn){!function(e){e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(t),n.$vuepress.$set("siteData",t);const r=new(e(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((e,t)=>(t.startsWith("$")&&(e[t]=o[t].get),e),i),{computed:i}}(e=>class{setPage(e){this.__page=e}get $site(){return e}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:e}=this.$page.frontmatter;return"string"==typeof e&&e}get $title(){const e=this.$page,{metaTitle:t}=this.$page.frontmatter;if("string"==typeof t)return t;const n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const e=function(e){if(e){const t=e.filter(e=>"description"===e.name)[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(e,t){for(let n=0;nn||(e.hash?!Kn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(e.hash)}:{x:0,y:0})});!function(e){e.beforeEach((t,n,r)=>{if(Rs(e,t.path))r();else if(/(\/|\.html)$/.test(t.path))if(/\/$/.test(t.path)){const n=t.path.replace(/\/$/,"")+".html";Rs(e,n)?r(n):r()}else r();else{const n=t.path+"/",o=t.path+".html";Rs(e,o)?r(o):Rs(e,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Es.filter(e=>"function"==typeof e).map(t=>t({Vue:Kn,options:r,router:n,siteData:$s,isServer:e})))}catch(e){console.error(e)}return{app:new Kn(Object.assign(r,{router:n,render:e=>e("div",{attrs:{id:"app"}},[e("RouterView",{ref:"layout"}),e("div",{class:"global-ui"},As.map(t=>e(t)))])})),router:n}}(!1).then(({app:e,router:t})=>{t.onReady(()=>{e.$mount("#app")})})}]); \ No newline at end of file diff --git a/code_of_conduct/index.html b/code_of_conduct/index.html index cb7fac154..a59b2c7eb 100644 --- a/code_of_conduct/index.html +++ b/code_of_conduct/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/codegen.html b/codegen.html index 58d77b8f0..ec7a3350a 100644 --- a/codegen.html +++ b/codegen.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/coercion.html b/coercion.html index ddd7c2e80..b3f308bee 100644 --- a/coercion.html +++ b/coercion.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/components.html b/components.html index da084aa9f..5fcaf39bd 100644 --- a/components.html +++ b/components.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/contributing/index.html b/contributing/index.html index fb6e7afc9..84bf9a92e 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/faq.html b/faq.html index f6d298bfa..788b59ba3 100644 --- a/faq.html +++ b/faq.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/async-validation.html b/guide/async-validation.html index 7cca18e3e..74fa88b2f 100644 --- a/guide/async-validation.html +++ b/guide/async-validation.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/combining-schemas.html b/guide/combining-schemas.html index b2e685397..4b99ee1a8 100644 --- a/guide/combining-schemas.html +++ b/guide/combining-schemas.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/environments.html b/guide/environments.html index 39b4d7065..1f7a9732f 100644 --- a/guide/environments.html +++ b/guide/environments.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/formats.html b/guide/formats.html index 4cf92d9ea..bd1e345fc 100644 --- a/guide/formats.html +++ b/guide/formats.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/getting-started.html b/guide/getting-started.html index 40570bbeb..331a377e3 100644 --- a/guide/getting-started.html +++ b/guide/getting-started.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/managing-schemas.html b/guide/managing-schemas.html index c11ba6e0a..f460b0d7e 100644 --- a/guide/managing-schemas.html +++ b/guide/managing-schemas.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/modifying-data.html b/guide/modifying-data.html index a48bcdd6f..906b4f23c 100644 --- a/guide/modifying-data.html +++ b/guide/modifying-data.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/schema-language.html b/guide/schema-language.html index 38027ae40..c783bf68a 100644 --- a/guide/schema-language.html +++ b/guide/schema-language.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/typescript.html b/guide/typescript.html index 8c079289e..5dc1d2a81 100644 --- a/guide/typescript.html +++ b/guide/typescript.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/user-keywords.html b/guide/user-keywords.html index 2ad4f0b7f..0c6fc092c 100644 --- a/guide/user-keywords.html +++ b/guide/user-keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/why-ajv.html b/guide/why-ajv.html index 92e5d9d7a..53f9a71f8 100644 --- a/guide/why-ajv.html +++ b/guide/why-ajv.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/index.html b/index.html index dd466f598..7d425ad96 100644 --- a/index.html +++ b/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/json-schema.html b/json-schema.html index ff4c06b16..2e68a902c 100644 --- a/json-schema.html +++ b/json-schema.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/json-type-definition.html b/json-type-definition.html index bd89b88b5..c5d44dd80 100644 --- a/json-type-definition.html +++ b/json-type-definition.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/keywords.html b/keywords.html index 8aa19b704..e97902115 100644 --- a/keywords.html +++ b/keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/license.html b/license.html index 6a9cac414..350f5dead 100644 --- a/license.html +++ b/license.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2020-08-14-mozilla-grant-openjs-foundation.html b/news/2020-08-14-mozilla-grant-openjs-foundation.html index 1812ff0f3..1f09963f2 100644 --- a/news/2020-08-14-mozilla-grant-openjs-foundation.html +++ b/news/2020-08-14-mozilla-grant-openjs-foundation.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2020-12-15-ajv-version-7-released.html b/news/2020-12-15-ajv-version-7-released.html index abd12e2b7..335bcf007 100644 --- a/news/2020-12-15-ajv-version-7-released.html +++ b/news/2020-12-15-ajv-version-7-released.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-03-07-ajv-supports-json-type-definition.html b/news/2021-03-07-ajv-supports-json-type-definition.html index d587ec5ed..c7e4a8751 100644 --- a/news/2021-03-07-ajv-supports-json-type-definition.html +++ b/news/2021-03-07-ajv-supports-json-type-definition.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-03-27-ajv-version-8-released.html b/news/2021-03-27-ajv-version-8-released.html index 21ac22793..a11b03995 100644 --- a/news/2021-03-27-ajv-version-8-released.html +++ b/news/2021-03-27-ajv-version-8-released.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-04-24-ajv-online-event.html b/news/2021-04-24-ajv-online-event.html index 8334109da..988be546a 100644 --- a/news/2021-04-24-ajv-online-event.html +++ b/news/2021-04-24-ajv-online-event.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/2021-05-24-ajv-online-event-video.html b/news/2021-05-24-ajv-online-event-video.html index 9b84019d7..6494b07b4 100644 --- a/news/2021-05-24-ajv-online-event-video.html +++ b/news/2021-05-24-ajv-online-event-video.html @@ -18,8 +18,8 @@ - - + + - + diff --git a/news/2021-07-22-ajv-microsoft-foss-fund-award.html b/news/2021-07-22-ajv-microsoft-foss-fund-award.html index d9a06fdec..ba68087b5 100644 --- a/news/2021-07-22-ajv-microsoft-foss-fund-award.html +++ b/news/2021-07-22-ajv-microsoft-foss-fund-award.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/news/index.html b/news/index.html index fb9830aa9..c315050b3 100644 --- a/news/index.html +++ b/news/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/options.html b/options.html index 705593e99..3fb405e93 100644 --- a/options.html +++ b/options.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-cli.html b/packages/ajv-cli.html index 507a88502..5fc4dbaa0 100644 --- a/packages/ajv-cli.html +++ b/packages/ajv-cli.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-errors.html b/packages/ajv-errors.html index 57baf9e60..311c7931e 100644 --- a/packages/ajv-errors.html +++ b/packages/ajv-errors.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-formats.html b/packages/ajv-formats.html index 71a0e8b03..bb70c9d2d 100644 --- a/packages/ajv-formats.html +++ b/packages/ajv-formats.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-i18n.html b/packages/ajv-i18n.html index 6cfaec9e2..26b684586 100644 --- a/packages/ajv-i18n.html +++ b/packages/ajv-i18n.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-keywords.html b/packages/ajv-keywords.html index e0bc1bae0..f692c21a5 100644 --- a/packages/ajv-keywords.html +++ b/packages/ajv-keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/index.html b/packages/index.html index aefe0fa85..eeae061c9 100644 --- a/packages/index.html +++ b/packages/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/security.html b/security.html index cf3c75b0e..08e9ab9d6 100644 --- a/security.html +++ b/security.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/standalone.html b/standalone.html index ad5164c1a..5952acc7d 100644 --- a/standalone.html +++ b/standalone.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/strict-mode.html b/strict-mode.html index f79831f06..656ba7524 100644 --- a/strict-mode.html +++ b/strict-mode.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/testimonials.html b/testimonials.html index 89917c0fb..d04437380 100644 --- a/testimonials.html +++ b/testimonials.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/v6-to-v8-migration.html b/v6-to-v8-migration.html index d3200538a..11382cb14 100644 --- a/v6-to-v8-migration.html +++ b/v6-to-v8-migration.html @@ -18,8 +18,8 @@ - - + +