From 2955070b5d5b1600250a1a8580fc39069c8396aa Mon Sep 17 00:00:00 2001 From: GitHub workflow <2769109+epoberezkin@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:31:53 +0000 Subject: [PATCH] updated by ajv workflow https://github.com/ajv-validator/ajv/actions/runs/8022143187 --- 404.html | 8 +++---- api.html | 6 ++--- assets/css/0.styles.8749492d.css | 1 + assets/img/contributors.899b9b6f.jpg | Bin 0 -> 235161 bytes assets/js/21.5c0dc322.js | 1 + assets/js/44.c11e9fc1.js | 1 + assets/js/53.8ce62b10.js | 1 + assets/js/54.985837ea.js | 1 + assets/js/55.cd887e1c.js | 1 + assets/js/59.13896c85.js | 1 + assets/js/61.cdbb4ea0.js | 1 + assets/js/62.41f37764.js | 1 + assets/js/63.f8b2c276.js | 1 + assets/js/84.454418cc.js | 1 + assets/js/85.2af51465.js | 1 + assets/js/app.cce4d25b.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 | 22 +++++++++--------- 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 ++--- 58 files changed, 169 insertions(+), 141 deletions(-) create mode 100644 assets/css/0.styles.8749492d.css create mode 100644 assets/img/contributors.899b9b6f.jpg create mode 100644 assets/js/21.5c0dc322.js create mode 100644 assets/js/44.c11e9fc1.js create mode 100644 assets/js/53.8ce62b10.js create mode 100644 assets/js/54.985837ea.js create mode 100644 assets/js/55.cd887e1c.js create mode 100644 assets/js/59.13896c85.js create mode 100644 assets/js/61.cdbb4ea0.js create mode 100644 assets/js/62.41f37764.js create mode 100644 assets/js/63.f8b2c276.js create mode 100644 assets/js/84.454418cc.js create mode 100644 assets/js/85.2af51465.js create mode 100644 assets/js/app.cce4d25b.js diff --git a/404.html b/404.html index 5e3fd8a03..bb7c05952 100644 --- a/404.html +++ b/404.html @@ -18,13 +18,13 @@ - - + + -

404

There's nothing here.
+ - + diff --git a/api.html b/api.html index 08be93853..e066f723e 100644 --- a/api.html +++ b/api.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/assets/css/0.styles.8749492d.css b/assets/css/0.styles.8749492d.css new file mode 100644 index 000000000..b4c740e33 --- /dev/null +++ b/assets/css/0.styles.8749492d.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.899b9b6f.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.899b9b6f.jpg b/assets/img/contributors.899b9b6f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6245c28bd478c2b663748d2293da27d53d02e469 GIT binary patch literal 235161 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

y`sGa$AL5jv=#Zq3I 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/js/21.5c0dc322.js b/assets/js/21.5c0dc322.js new file mode 100644 index 000000000..90977731c --- /dev/null +++ b/assets/js/21.5c0dc322.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{282:function(a,e,n){},347:function(a,e){a.exports=["epoberezkin","spaced4ndy","erikbrinkman","dependabot[bot]","PBug90","blakeembrey","sambauers","meirotstein","gajus","Tyharo1","igor-savin-ht","b4h0-c4t","willfarrell","boenrobot","yume-chan","jasoniangreen","GrahamLea","franciscomorais","asaid-0","domoritz","imbstack","pithu","realityking","efebarlas","Nonemoticoner","pcwiek","rehanvdm","farrago","SoAsEr","kroky","Delagen","YChebotaev","bhvngt","t7yang","teq0","wuweiss","zekth","egfx-notifications","brendo","awlayton","HotelDon","donaldpipowitch","mummybot","Fdawgs","G-Rath","HolgerJeromin","monkeywithacupcake","ktrueda","lucassaid","marshall007","mattpolzin","MichaelDeBoey","mbroadst","radekmie","merlindorin","Romakita","rbuckton","ryanmeador","mighty1231","simon04","SirLich","krenor","stuartpb","TIBCOeddie","bearmini","not-an-aardvark","thernstig","MattiAstedrone","MikeRalphson","tyok","MrJithil","mychaelgo","natflow","nwoltman","nimerritt","nicksrandall","Noam3kCH","eventlistener","Opticsponge","orgads","papb","philsturgeon","carlo-quinonez","ChALkeR","anchnk","duxing","wyfo","aladdin-add","vlbee","tridium","superfaz","schokotets","sahilda","rek","qwertyforce","pskfyi","ossdev07","oldmud0","jsdevel","jonganc","fridays","franrolando","fpicalausa","ehmicky","dfeufel","cjancsar","byr-gdp","billytrend","villasv","vargaeric","cvlab","isTravis","koba04","TommyDew42","m00s","gj","EtaiG","ecwyne","forivall","rubiagatra","thetric","keyten","dimitropoulos","Delapouite","daveisfera","darcyparker","FunkyDck","dancasey","dannyb648","dalcib","caub","smithc10","delavara","ChuntaoLu","cpillsbury","cbrwflo","eventualbuddha","bradjones1","vendeza","kulakowka","andyscott","asprouse","anslzo","avanelli","Alexsey","ahmdsolmn","mxsgx","dzuremar","mduu","VIEWVIEWVIEW","Eomm","jsbrain","alazyzombie","LinusU","leonardovillela","johanlelan","kpping","platinumazure","lehni","kapouer","justinpowers","jboavida","jonathanGB","jonasfj","jrr","mrjgreen","JamesJansson","P0lip","ivansieder","idangozlan","is2ei","handrews","hans-kinnek","seriousme","hadrien-toma","garrows","rgeerts"]},348:function(a,e,n){"use strict";n(282)},379:function(a,e,n){"use strict";n.r(e);var r=n(347),o=n.n(r),i={data:()=>({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/44.c11e9fc1.js b/assets/js/44.c11e9fc1.js new file mode 100644 index 000000000..0212ac87a --- /dev/null +++ b/assets/js/44.c11e9fc1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{393: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("h1",{attrs:{id:"api-reference"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api-reference"}},[t._v("#")]),t._v(" API Reference")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#ajv-constructor-and-methods"}},[t._v("Ajv constructor and methods")]),a("ul",[a("li",[a("a",{attrs:{href:"#new-ajv-options-object"}},[t._v("new Ajv(options: object)")])]),a("li",[a("a",{attrs:{href:"#ajv-compile-schema-object-data-any-boolean-promise-any"}},[t._v("ajv.compile(schema: object): (data: any) => boolean | Promise < any >")])]),a("li",[a("a",{attrs:{href:"#ajv-compileserializer-schema-object-data-any-string"}},[t._v("ajv.compileSerializer(schema: object): (data: any) => string "),a("Badge",{attrs:{text:"NEW"}})],1)]),a("li",[a("a",{attrs:{href:"#ajv-compileparser-schema-object-json-string-any"}},[t._v("ajv.compileParser(schema: object): (json: string) => any "),a("Badge",{attrs:{text:"NEW"}})],1)]),a("li",[a("a",{attrs:{href:"#ajv-compileasync-schema-object-meta-boolean-promise-function"}},[t._v("ajv.compileAsync(schema: object, meta?: boolean): Promise < Function >")])]),a("li",[a("a",{attrs:{href:"#ajv-validate-schemaorref-object-string-data-any-boolean"}},[t._v("ajv.validate(schemaOrRef: object | string, data: any): boolean")])]),a("li",[a("a",{attrs:{href:"#ajv-addschema-schema-object-object-key-string-ajv"}},[t._v("ajv.addSchema(schema: object | object[], key?: string): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-addmetaschema-schema-object-object-key-string-ajv"}},[t._v("ajv.addMetaSchema(schema: object | object[], key?: string): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-validateschema-schema-object-boolean"}},[t._v("ajv.validateSchema(schema: object): boolean")])]),a("li",[a("a",{attrs:{href:"#ajv-getschema-key-string-undefined-data-any-boolean-promise-any"}},[t._v("ajv.getSchema(key: string): undefined | ((data: any) => boolean | Promise < any >)")])]),a("li",[a("a",{attrs:{href:"#ajv-removeschema-schemaorref-object-string-regexp-ajv"}},[t._v("ajv.removeSchema(schemaOrRef: object | string | RegExp): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-addformat-name-string-format-format-ajv"}},[t._v("ajv.addFormat(name: string, format: Format): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-addkeyword-definition-string-object-ajv"}},[t._v("ajv.addKeyword(definition: string | object): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-getkeyword-keyword-string-object-boolean"}},[t._v("ajv.getKeyword(keyword: string): object | boolean")])]),a("li",[a("a",{attrs:{href:"#ajv-removekeyword-keyword-string-ajv"}},[t._v("ajv.removeKeyword(keyword: string): Ajv")])]),a("li",[a("a",{attrs:{href:"#ajv-errorstext-errors-object-options-object-string"}},[t._v("ajv.errorsText(errors?: object[], options?: object): string")])])])]),a("li",[a("a",{attrs:{href:"#validation-errors"}},[t._v("Validation errors")]),a("ul",[a("li",[a("a",{attrs:{href:"#error-objects"}},[t._v("Error objects")])]),a("li",[a("a",{attrs:{href:"#error-parameters"}},[t._v("Error parameters")])]),a("li",[a("a",{attrs:{href:"#errors-i18n"}},[t._v("Errors i18n")])]),a("li",[a("a",{attrs:{href:"#error-logging"}},[t._v("Error logging")])])])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"ajv-constructor-and-methods"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-constructor-and-methods"}},[t._v("#")]),t._v(" Ajv constructor and methods")]),t._v(" "),a("h3",{attrs:{id:"new-ajv-options-object"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#new-ajv-options-object"}},[t._v("#")]),t._v(" new Ajv(options: object)")]),t._v(" "),a("p",[t._v("Create 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(")")]),t._v("\n")])])]),a("p",[t._v("See "),a("a",{attrs:{href:"./options"}},[t._v("Options")])]),t._v(" "),a("h3",{attrs:{id:"ajv-compile-schema-object-data-any-boolean-promise-any"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-compile-schema-object-data-any-boolean-promise-any"}},[t._v("#")]),t._v(" ajv.compile(schema: object): (data: any) => boolean | Promise < any >")]),t._v(" "),a("p",[t._v("Generate validating function and cache the compiled schema for future use.")]),t._v(" "),a("p",[t._v("Validating function returns a boolean value (or promise for async schemas that must have "),a("code",[t._v("$async: true")]),t._v(" property - see "),a("RouterLink",{attrs:{to:"/guide/async-validation.html"}},[t._v("Asynchronous validation")]),t._v("). This function has properties "),a("code",[t._v("errors")]),t._v(" and "),a("code",[t._v("schema")]),t._v(". Errors encountered during the last validation are assigned to "),a("code",[t._v("errors")]),t._v(" property (it is assigned "),a("code",[t._v("null")]),t._v(" if there was no errors). "),a("code",[t._v("schema")]),t._v(" property contains the reference to the original schema.")],1),t._v(" "),a("p",[t._v("The schema passed to this method will be validated against meta-schema unless "),a("code",[t._v("validateSchema")]),t._v(" option is false. If schema is invalid, an error will be thrown. See "),a("a",{attrs:{href:"#options"}},[t._v("options")]),t._v(".")]),t._v(" "),a("p",[t._v("In typescript returned validation function can be a type guard if you pass type parameter:")]),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("Foo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),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"),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(" FooSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" JSONSchemaType"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),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 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 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("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("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 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 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 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 generic-function"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("Foo"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("FooSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type of validate extends `(data: any) => data is Foo`")]),t._v("\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 builtin"}},[t._v("any")]),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("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"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),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 punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is Foo here")]),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("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("foo"),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(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),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("(")]),t._v("validate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),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("See more advanced example in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/types/json-schema.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("the test"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[a("a",{attrs:{name:"jtd-serialize"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-compileserializer-schema-object-data-any-string"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-compileserializer-schema-object-data-any-string"}},[t._v("#")]),t._v(" ajv.compileSerializer(schema: object): (data: any) => string "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("p",[t._v("Generate serializing function based on the "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JTD schema")]),t._v(" (caches the schema) - only in JTD instance of Ajv (see example below).")],1),t._v(" "),a("p",[t._v("Serializers compiled from JTD schemas can be more than 10 times faster than using "),a("code",[t._v("JSON.stringify")]),t._v(", because they do not traverse all the data, only the properties that are defined in the schema.")]),t._v(" "),a("p",[t._v("Properties not defined in the schema will not be included in serialized JSON, unless the schema has "),a("code",[t._v("additionalProperties: true")]),t._v(" flag. It can also be beneficial from the application security point of view, as it prevents leaking accidentally/temporarily added additional properties to the API responses.")]),t._v(" "),a("p",[t._v("If you use JTD with typescript, the type for the schema can be derived from the data type, and generated serializer would only accept correct data type in this case:")]),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(" Ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("JTDSchemaType"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),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\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("MyData")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n foo"),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 bar"),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"),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(" mySchema"),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("MyData"),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 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("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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// any JTD number type would be accepted 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 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 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("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\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" serializeMyData "),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("compileSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mySchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// serializeMyData has type (x: MyData) => string")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it prevents you from accidentally passing the wrong type")]),t._v("\n")])])]),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Compiled serializers do NOT validate data!")]),t._v(" "),a("p",[t._v("It is assumed that the data is valid according to the schema.")])]),t._v(" "),a("p",[a("a",{attrs:{name:"jtd-parse"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-compileparser-schema-object-json-string-any"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-compileparser-schema-object-json-string-any"}},[t._v("#")]),t._v(" ajv.compileParser(schema: object): (json: string) => any "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("p",[t._v("Generate parsing function based on the "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JTD schema")]),t._v(" (caches the schema) - only in JTD instance of Ajv (see example below).")],1),t._v(" "),a("p",[t._v("Parsers compiled from JTD schemas have comparable performance to "),a("code",[t._v("JSON.parse")]),a("sup",[t._v("*")]),t._v(" in case JSON string is valid according to the schema (and they do not just parse JSON - they ensure that parsed JSON is valid according to the schema as they parse), but they can be many times faster in case the string is invalid - for example, if schema expects an object, and JSON string is array the parser would fail on the first character.")]),t._v(" "),a("p",[t._v("Parsing will fail if there are properties not defined in the schema, unless the schema has "),a("code",[t._v("additionalProperties: true")]),t._v(" flag.")]),t._v(" "),a("p",[t._v("If you use JTD with typescript, the type for the schema can be derived from the data type, and generated parser will return correct data type (see definitions example in the "),a("a",{attrs:{href:"#jtd-serialize"}},[t._v("serialize")]),t._v(" section):")]),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(" parseMyData "),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("compileParser")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mySchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// parseMyData has type (s: string) => MyData | undefined")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it returns correct data type in case parsing is successful and undefined if not")]),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 function"}},[t._v("parseMyData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{\"foo\":1}'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// {foo: 1} - success")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invalidData "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseMyData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'{\"x\":1}'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// undefined - failure")]),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("(")]),t._v("parseMyData"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("position"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 4")]),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("(")]),t._v("parseMyData"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// property x not allowed")]),t._v("\n")])])]),a("p",[a("sup",[t._v("*")]),t._v(" As long as empty schema "),a("code",[t._v("{}")]),t._v(" is not used - there is a possibility to improve performance in this case. Also, the performance of parsing "),a("code",[t._v("discriminator")]),t._v(" schemas depends on the position of discriminator tag in the schema - the best parsing performance will be achieved if the tag is the first property - this is how compiled JTD serializers generate JSON in case of discriminator schemas.")]),t._v(" "),a("p",[a("a",{attrs:{name:"api-compileAsync"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-compileasync-schema-object-meta-boolean-promise-function"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-compileasync-schema-object-meta-boolean-promise-function"}},[t._v("#")]),t._v(" ajv.compileAsync(schema: object, meta?: boolean): Promise < Function >")]),t._v(" "),a("p",[t._v("Asynchronous version of "),a("code",[t._v("compile")]),t._v(" method that loads missing remote schemas using asynchronous function in "),a("code",[t._v("options.loadSchema")]),t._v(". This function returns a Promise that resolves to a validation function. An optional callback passed to "),a("code",[t._v("compileAsync")]),t._v(" will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when:")]),t._v(" "),a("ul",[a("li",[t._v("missing schema can't be loaded ("),a("code",[t._v("loadSchema")]),t._v(" returns a Promise that rejects).")]),t._v(" "),a("li",[t._v("a schema containing a missing reference is loaded, but the reference cannot be resolved.")]),t._v(" "),a("li",[t._v("schema (or some loaded/referenced schema) is invalid.")])]),t._v(" "),a("p",[t._v("The function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded.")]),t._v(" "),a("p",[t._v("You can asynchronously compile meta-schema by passing "),a("code",[t._v("true")]),t._v(" as the second parameter.")]),t._v(" "),a("p",[t._v("Similarly to "),a("code",[t._v("compile")]),t._v(", it can return type guard in typescript.")]),t._v(" "),a("p",[t._v("See example in "),a("RouterLink",{attrs:{to:"/guide/managing-schemas.html#asynchronous-schema-loading"}},[t._v("Asynchronous schema loading")]),t._v(".")],1),t._v(" "),a("h3",{attrs:{id:"ajv-validate-schemaorref-object-string-data-any-boolean"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-validate-schemaorref-object-string-data-any-boolean"}},[t._v("#")]),t._v(" ajv.validate(schemaOrRef: object | string, data: any): boolean")]),t._v(" "),a("p",[t._v("Validate data using passed schema (it will be compiled and cached).")]),t._v(" "),a("p",[t._v("Instead of the schema you can use the key that was previously passed to "),a("code",[t._v("addSchema")]),t._v(", the schema id if it was present in the schema or any previously resolved reference.")]),t._v(" "),a("p",[t._v("Validation errors will be available in the "),a("code",[t._v("errors")]),t._v(" property of Ajv instance ("),a("code",[t._v("null")]),t._v(" if there were no errors).")]),t._v(" "),a("p",[t._v("In typescript this method can act as a type guard (similarly to function returned by "),a("code",[t._v("compile")]),t._v(" method - see example there).")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Save errors property")]),t._v(" "),a("p",[t._v("Every time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later.")])]),t._v(" "),a("p",[t._v("If the schema is asynchronous (has "),a("code",[t._v("$async")]),t._v(" keyword on the top level) this method returns a Promise. See "),a("RouterLink",{attrs:{to:"/guide/async-validation.html"}},[t._v("Asynchronous validation")]),t._v(".")],1),t._v(" "),a("p",[a("a",{attrs:{id:"add-schema"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-addschema-schema-object-object-key-string-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-addschema-schema-object-object-key-string-ajv"}},[t._v("#")]),t._v(" ajv.addSchema(schema: object | object[], key?: string): Ajv")]),t._v(" "),a("p",[t._v("Add schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole.")]),t._v(" "),a("p",[t._v("Array of schemas can be passed (schemas should have ids), the second parameter will be ignored.")]),t._v(" "),a("p",[t._v("Key can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key.")]),t._v(" "),a("p",[t._v("Once the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data.")]),t._v(" "),a("p",[t._v("Although "),a("code",[t._v("addSchema")]),t._v(" does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time.")]),t._v(" "),a("p",[t._v("By default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by "),a("code",[t._v("validateSchema")]),t._v(" option.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Method chaining")]),t._v(" "),a("p",[t._v("Ajv returns its instance for chaining from all methods prefixed "),a("code",[t._v("add*")]),t._v(" and "),a("code",[t._v("remove*")]),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(" validate "),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 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("schema"),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("addFormat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" regex"),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("getSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("uri"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])]),t._v(" "),a("h3",{attrs:{id:"ajv-addmetaschema-schema-object-object-key-string-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-addmetaschema-schema-object-object-key-string-ajv"}},[t._v("#")]),t._v(" ajv.addMetaSchema(schema: object | object[], key?: string): Ajv")]),t._v(" "),a("p",[t._v("Adds meta schema(s) that can be used to validate other schemas. That function should be used instead of "),a("code",[t._v("addSchema")]),t._v(" because there may be instance options that would compile a meta schema incorrectly (at the moment it is "),a("code",[t._v("removeAdditional")]),t._v(" option).")]),t._v(" "),a("p",[t._v("There is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option "),a("code",[t._v("meta")]),t._v(" is set to "),a("code",[t._v("false")]),t._v(". You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See "),a("code",[t._v("validateSchema")]),t._v(".")]),t._v(" "),a("p",[a("a",{attrs:{name:"api-validateschema"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-validateschema-schema-object-boolean"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-validateschema-schema-object-boolean"}},[t._v("#")]),t._v(" ajv.validateSchema(schema: object): boolean")]),t._v(" "),a("p",[t._v("Validates schema. This method should be used to validate schemas rather than "),a("code",[t._v("validate")]),t._v(" due to the inconsistency of "),a("code",[t._v("uri")]),t._v(" format in JSON Schema standard.")]),t._v(" "),a("p",[t._v("By default this method is called automatically when the schema is added, so you rarely need to use it directly.")]),t._v(" "),a("p",[t._v("If schema doesn't have "),a("code",[t._v("$schema")]),t._v(" property, it is validated against draft 6 meta-schema (option "),a("code",[t._v("meta")]),t._v(" should not be false).")]),t._v(" "),a("p",[t._v("If schema has "),a("code",[t._v("$schema")]),t._v(" property, then the schema with this id (that should be previously added) is used to validate passed schema.")]),t._v(" "),a("p",[t._v("Errors will be available at "),a("code",[t._v("ajv.errors")]),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"ajv-getschema-key-string-undefined-data-any-boolean-promise-any"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-getschema-key-string-undefined-data-any-boolean-promise-any"}},[t._v("#")]),t._v(" ajv.getSchema(key: string): undefined | ((data: any) => boolean | Promise < any >)")]),t._v(" "),a("p",[t._v("Retrieve compiled schema previously added with "),a("code",[t._v("addSchema")]),t._v(" by the key passed to "),a("code",[t._v("addSchema")]),t._v(" or by its full reference (id). The returned validating function has "),a("code",[t._v("schema")]),t._v(" property with the reference to the original schema.")]),t._v(" "),a("h3",{attrs:{id:"ajv-removeschema-schemaorref-object-string-regexp-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-removeschema-schemaorref-object-string-regexp-ajv"}},[t._v("#")]),t._v(" ajv.removeSchema(schemaOrRef: object | string | RegExp): Ajv")]),t._v(" "),a("p",[t._v("Remove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references.")]),t._v(" "),a("p",[t._v("Schema can be removed using:")]),t._v(" "),a("ul",[a("li",[t._v("key passed to "),a("code",[t._v("addSchema")])]),t._v(" "),a("li",[t._v("it's full reference (id)")]),t._v(" "),a("li",[t._v("RegExp that should match schema id or key (meta-schemas won't be removed)")]),t._v(" "),a("li",[t._v("actual schema object (that will be optionally serialized) to remove schema from cache")])]),t._v(" "),a("p",[t._v("If no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared.")]),t._v(" "),a("p",[a("a",{attrs:{name:"api-addformat"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-addformat-name-string-format-format-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-addformat-name-string-format-format-ajv"}},[t._v("#")]),t._v(" ajv.addFormat(name: string, format: Format): Ajv")]),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("Format")]),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 boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// to ignore this format (and pass validation)")]),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("string")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// will be converted to RegExp")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" RegExp\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),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("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 builtin"}},[t._v("boolean")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" Object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// format definition (see below and in types)")]),t._v("\n")])])]),a("p",[t._v("Add format to validate strings or numbers.")]),t._v(" "),a("p",[t._v("If object is passed it should have properties "),a("code",[t._v("validate")]),t._v(", "),a("code",[t._v("compare")]),t._v(" and "),a("code",[t._v("async")]),t._v(":")]),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("FormatDefinition")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// actual type definition is more precise - see types.ts")]),t._v("\n validate"),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(" RegExp "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),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("number")]),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 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("boolean")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n compare"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data1"),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(" data2"),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 operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("number")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// an optional function that accepts two strings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and compares them according to the format meaning.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// This function is used with keywords `formatMaximum`/`formatMinimum`")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package).")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// It should return `1` if the first value is bigger than the second value,")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// `-1` if it is smaller and `0` if it is equal.")]),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 boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if `validate` is an asynchronous function")]),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(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"string"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"number"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "string" is default. If data type is different, the validation will pass.')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Formats can be also added via "),a("code",[t._v("formats")]),t._v(" option.")]),t._v(" "),a("p",[a("a",{attrs:{name:"api-addkeyword"}})]),t._v(" "),a("h3",{attrs:{id:"ajv-addkeyword-definition-string-object-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-addkeyword-definition-string-object-ajv"}},[t._v("#")]),t._v(" ajv.addKeyword(definition: string | object): Ajv")]),t._v(" "),a("p",[t._v("Add validation keyword to Ajv instance.")]),t._v(" "),a("p",[t._v("Keyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance.")]),t._v(" "),a("p",[t._v("Keyword must start with a letter, "),a("code",[t._v("_")]),t._v(" or "),a("code",[t._v("$")]),t._v(", and may continue with letters, numbers, "),a("code",[t._v("_")]),t._v(", "),a("code",[t._v("$")]),t._v(", or "),a("code",[t._v("-")]),t._v(".\nIt is recommended to use an application-specific prefix for keywords to avoid current and future name collisions.")]),t._v(" "),a("p",[t._v("Example Keywords:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v('"xyz-example"')]),t._v(": valid, and uses prefix for the xyz project to avoid name collisions.")]),t._v(" "),a("li",[a("code",[t._v('"example"')]),t._v(": valid, but not recommended as it may collide with future versions of JSON Schema etc.")]),t._v(" "),a("li",[a("code",[t._v('"3-example"')]),t._v(": invalid as numbers are not allowed to be the first character in a keyword")])]),t._v(" "),a("p",[t._v("Keyword definition is an object with the following 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("KeywordDefinition")]),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("// actual type definition is more precise - see types.ts")]),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 comment"}},[t._v("// keyword name")]),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(" "),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// JSON data type(s) the keyword applies to. Default - all types.")]),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(" "),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the required schema JSON type")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("code")]),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("Function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// function to generate code, used for all pre-defined keywords")]),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(" "),a("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("Function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// validating function")]),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 builtin"}},[t._v("Function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// compiling function")]),t._v("\n macro"),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("Function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// macro function")]),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(" object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error definition object - see types.ts")]),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 boolean"}},[t._v("false")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// used with "validate" keyword to not pass schema to function')]),t._v("\n metaSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// meta-schema for keyword schema")]),t._v("\n dependencies"),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("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// properties that must be present in the parent schema -")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it will be checked during schema compilation")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("implements")]),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("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// keyword names to reserve that this keyword implements")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("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 boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// MUST be passed if keyword modifies data")]),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// to pre-define validation result, validation function result will be ignored -")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this option MUST NOT be used with `macro` keywords.")]),t._v("\n $data"),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 boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// to support [\\$data reference](./guide/combining-schemas.md#data-reference) as the value of keyword.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// The reference will be resolved at validation time. If the keyword has meta-schema,")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it would be extended to allow $data and it will be used to validate the resolved value.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Supporting $data reference requires that keyword has `code` or `validate` function")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (the latter can be used in addition to `compile` or `macro`).")]),t._v("\n $dataError"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error definition object for invalid \\$data schema - see types.ts")]),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 boolean"}},[t._v("true")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if the validation function is asynchronous")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (whether it is returned from `compile` or passed in `validate` property).")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// It should return a promise that resolves with a value `true` or `false`.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// This option is ignored in case of "macro" and "code" keywords.')]),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// whether keyword returns errors.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// If this property is not passed Ajv will determine")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if the errors were set in case of failed validation.")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("If only the property "),a("code",[t._v("keyword")]),t._v(" is provided in the definition object, you can also pass the keyword name as the argument.")]),t._v(" "),a("p",[a("code",[t._v("compile")]),t._v(", "),a("code",[t._v("macro")]),t._v(" and "),a("code",[t._v("code")]),t._v(" are mutually exclusive, only one should be used at a time. "),a("code",[t._v("validate")]),t._v(" can be used separately or in addition to "),a("code",[t._v("compile")]),t._v(" or "),a("code",[t._v("macro")]),t._v(" to support "),a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v(".")],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Keyword is validated only for applicable data types")]),t._v(" "),a("p",[t._v("If the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate "),a("code",[t._v("type")]),t._v(" keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed.")])]),t._v(" "),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/keywords.html"}},[t._v("User defined keywords")]),t._v(" for more details.")],1),t._v(" "),a("h3",{attrs:{id:"ajv-getkeyword-keyword-string-object-boolean"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-getkeyword-keyword-string-object-boolean"}},[t._v("#")]),t._v(" ajv.getKeyword(keyword: string): object | boolean")]),t._v(" "),a("p",[t._v("Returns keyword definition, "),a("code",[t._v("false")]),t._v(" if the keyword is unknown.")]),t._v(" "),a("h3",{attrs:{id:"ajv-removekeyword-keyword-string-ajv"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-removekeyword-keyword-string-ajv"}},[t._v("#")]),t._v(" ajv.removeKeyword(keyword: string): Ajv")]),t._v(" "),a("p",[t._v("Removes added or pre-defined keyword so you can redefine them.")]),t._v(" "),a("p",[t._v("While this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Compiled schemas and removed keywords")]),t._v(" "),a("p",[t._v("The schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use "),a("code",[t._v("removeSchema")]),t._v(" method and compile them again.")])]),t._v(" "),a("h3",{attrs:{id:"ajv-errorstext-errors-object-options-object-string"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ajv-errorstext-errors-object-options-object-string"}},[t._v("#")]),t._v(" ajv.errorsText(errors?: object[], options?: object): string")]),t._v(" "),a("p",[t._v("Returns the text with all errors in a String.")]),t._v(" "),a("p",[t._v("Options can have properties "),a("code",[t._v("separator")]),t._v(' (string used to separate errors, ", " by default) and '),a("code",[t._v("dataVar")]),t._v(' (the variable name that instancePath is prefixed with, "data" by default).')]),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("In case of validation failure, Ajv assigns the array of errors to "),a("code",[t._v("errors")]),t._v(" property of validation function (or to "),a("code",[t._v("errors")]),t._v(" property of Ajv instance when "),a("code",[t._v("validate")]),t._v(" or "),a("code",[t._v("validateSchema")]),t._v(" methods were called). In case of "),a("RouterLink",{attrs:{to:"/guide/async-validation.html"}},[t._v("asynchronous validation")]),t._v(", the returned promise is rejected with exception "),a("code",[t._v("Ajv.ValidationError")]),t._v(" that has "),a("code",[t._v("errors")]),t._v(" property.")],1),t._v(" "),a("h3",{attrs:{id:"error-objects"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#error-objects"}},[t._v("#")]),t._v(" Error objects")]),t._v(" "),a("p",[t._v("Each reported error is an object with the following 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("ErrorObject")]),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 comment"}},[t._v("// validation keyword.")]),t._v("\n instancePath"),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 comment"}},[t._v('// JSON Pointer to the location in the data instance (e.g., `"/prop/1/subProp"`).')]),t._v("\n schemaPath"),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 comment"}},[t._v("// JSON Pointer to the location of the failing keyword in the schema")]),t._v("\n params"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// type is defined by keyword value, see below")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// params property is the object with the additional information about error")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it can be used to generate error messages")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (e.g., using [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package).")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// See below for parameters set by all keywords.")]),t._v("\n propertyName"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// set for errors in `propertyNames` keyword schema.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// `instancePath` still points to the object in this case.")]),t._v("\n message"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the error message (can be excluded with option `messages: false`).")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Options below are added with `verbose` 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("any")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the value of the failing keyword in the schema.")]),t._v("\n parentSchema"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" object "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the schema containing the keyword.")]),t._v("\n data"),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("any")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the data validated by the keyword.")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("For "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JTD")]),t._v(" schemas "),a("code",[t._v("instancePath")]),t._v(" and "),a("code",[t._v("schemaPath")]),t._v(" depend on the nature of the failure - the errors are consistent with "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC8927"),a("OutboundLink")],1),t._v(".")],1),t._v(" "),a("h3",{attrs:{id:"error-parameters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#error-parameters"}},[t._v("#")]),t._v(" Error parameters")]),t._v(" "),a("p",[t._v("Properties of "),a("code",[t._v("params")]),t._v(" object in errors depend on the keyword that failed validation.")]),t._v(" "),a("p",[t._v("In typescript, the ErrorObject is a discriminated union that allows to determine the type of error parameters based on the value of 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("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 generic-function"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compile")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("MyData"),a("span",{pre:!0,attrs:{class:"token operator"}},[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("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),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 punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// data is MyData here")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ...")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),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("// DefinedError is a type for all pre-defined keywords errors,")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// validate.errors has type ErrorObject[] - to allow user-defined keywords with any error parameters.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Users can extend DefinedError to include the keywords errors they defined.")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" err "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("of")]),t._v(" validate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" DefinedError"),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("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("switch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("keyword"),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("case")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"maximum"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[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("(")]),t._v("err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("limit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("break")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pattern"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[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("(")]),t._v("err"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pattern"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("break")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[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("Also see an example in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv/blob/master/spec/types/error-parameters.spec.ts",target:"_blank",rel:"noopener noreferrer"}},[t._v("this test"),a("OutboundLink")],1)]),t._v(" "),a("ul",[a("li",[a("code",[t._v("maxItems")]),t._v(", "),a("code",[t._v("minItems")]),t._v(", "),a("code",[t._v("maxLength")]),t._v(", "),a("code",[t._v("minLength")]),t._v(", "),a("code",[t._v("maxProperties")]),t._v(", "),a("code",[t._v("minProperties")]),t._v(":")])]),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("ErrorParams")]),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("limit"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// keyword value")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("additionalItems")]),t._v(":")])]),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 comment"}},[t._v("// when `items` is an array of schemas and `additionalItems` is false:")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("type")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ErrorParams")]),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("limit"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the maximum number of allowed items")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("additionalProperties")]),t._v(":")])]),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("ErrorParams")]),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("additionalProperty"),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("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the property not defined in `properties` and `patternProperties` keywords")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("dependencies")]),t._v(":")])]),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("ErrorParams")]),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 property"),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 comment"}},[t._v("// dependent property,")]),t._v("\n missingProperty"),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 comment"}},[t._v("// required missing dependency - only the first one is reported")]),t._v("\n deps"),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 comment"}},[t._v("// required dependencies, comma separated list as a string (TODO change to string[])")]),t._v("\n depsCount"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// the number of required dependencies")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("format")]),t._v(":")])]),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("ErrorParams")]),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("format"),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 comment"}},[t._v("// keyword value")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("maximum")]),t._v(", "),a("code",[t._v("minimum")]),t._v(", "),a("code",[t._v("exclusiveMaximum")]),t._v(", "),a("code",[t._v("exclusiveMinimum")]),t._v(":")])]),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("ErrorParams")]),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 limit"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// keyword value")]),t._v("\n comparison"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"<="')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('">="')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"<"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('">"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// operation to compare the data to the limit,")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// with data on the left and the limit on the right")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("multipleOf")]),t._v(":")])]),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("ErrorParams")]),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("multipleOf"),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// keyword value")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("pattern")]),t._v(":")])]),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("ErrorParams")]),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("pattern"),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 comment"}},[t._v("// keyword value")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("required")]),t._v(":")])]),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("ErrorParams")]),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("missingProperty"),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 comment"}},[t._v("// required property that is missing")]),t._v("\n")])])]),a("ul",[a("li",[a("code",[t._v("propertyNames")]),t._v(":")])]),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("ErrorParams")]),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("propertyName"),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 comment"}},[t._v("// invalid property name")]),t._v("\n")])])]),a("p",[t._v("User-defined keywords can define other keyword parameters.")]),t._v(" "),a("h3",{attrs:{id:"errors-i18n"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#errors-i18n"}},[t._v("#")]),t._v(" Errors i18n")]),t._v(" "),a("p",[t._v("You can use "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-i18n",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-i18n"),a("OutboundLink")],1),t._v(" package to generate errors in other languages.")]),t._v(" "),a("h3",{attrs:{id:"error-logging"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#error-logging"}},[t._v("#")]),t._v(" Error logging")]),t._v(" "),a("p",[t._v("A logger instance can be passed via "),a("code",[t._v("logger")]),t._v(" option to Ajv constructor. The use of other logging packages is supported as long as the package or its associated wrapper exposes the required methods. If any of the required methods are missing an exception will be thrown.")]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Required Methods")]),t._v(": "),a("code",[t._v("log")]),t._v(", "),a("code",[t._v("warn")]),t._v(", "),a("code",[t._v("error")])])]),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(" otherLogger "),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("OtherLogger")]),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(" 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 literal-property property"}},[t._v("logger")]),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("log")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),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("bind")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("console"),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-variable function"}},[t._v("warn")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("warn")]),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 otherLogger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("logWarn")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("otherLogger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arguments"),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 function-variable function"}},[t._v("error")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),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 otherLogger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("logError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("otherLogger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arguments"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("error")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apply")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" arguments"),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("h5",{attrs:{id:"options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#options"}},[t._v("#")]),t._v(" Options")]),t._v(" "),a("p",[t._v("This section is moved to "),a("RouterLink",{attrs:{to:"/options.html"}},[t._v("Initialization options")]),t._v(" page")],1)])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/53.8ce62b10.js b/assets/js/53.8ce62b10.js new file mode 100644 index 000000000..d3b6da836 --- /dev/null +++ b/assets/js/53.8ce62b10.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{402: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/54.985837ea.js b/assets/js/54.985837ea.js new file mode 100644 index 000000000..df8dfcd17 --- /dev/null +++ b/assets/js/54.985837ea.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{403: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:"format-validation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#format-validation"}},[t._v("#")]),t._v(" Format validation")]),t._v(" "),a("h2",{attrs:{id:"string-formats"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#string-formats"}},[t._v("#")]),t._v(" String formats")]),t._v(" "),a("p",[t._v("From version 7 Ajv does not include formats defined by JSON Schema specification - these and several other formats are provided by "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" plugin.")]),t._v(" "),a("p",[t._v("To add all formats from this plugin:")]),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"')]),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")])])])]),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"')]),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\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")])])])])],1),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" documentation for further details.")]),t._v(" "),a("p",[t._v('It is recommended NOT to use "format" keyword implementations with untrusted data, as they may use potentially unsafe regular expressions (even though known issues are fixed) - see '),a("RouterLink",{attrs:{to:"/security.html#redos-attack"}},[t._v("ReDoS attack")]),t._v(".")],1),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("Format validation of untrusted data")]),t._v(" "),a("p",[t._v('If you need to use "format" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios.')])]),t._v(" "),a("p",[t._v("The following formats are defined in "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(' for string validation with "format" keyword:')]),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 with optional time-zone.")]),t._v(" "),a("li",[a("em",[t._v("date-time")]),t._v(": date-time from the same source (time-zone is mandatory).")]),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://datatracker.ietf.org/doc/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:"https://datatracker.ietf.org/doc/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://datatracker.ietf.org/doc/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("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Additional formats in ajv-formats-draft2019")]),t._v(" "),a("p",[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:"user-defined-formats"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#user-defined-formats"}},[t._v("#")]),t._v(" User-defined formats")]),t._v(" "),a("p",[t._v("You can add and replace any formats using "),a("RouterLink",{attrs:{to:"/api.html#ajv-addformat-name-string-format-format-ajv"}},[t._v("addFormat")]),t._v(" method:")],1),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("addFormat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"identifier"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token regex"}},[a("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")]),a("span",{pre:!0,attrs:{class:"token regex-source language-regex"}},[t._v("^a-z\\$_[a-zA-Z$_0-9]*$")]),a("span",{pre:!0,attrs:{class:"token regex-delimiter"}},[t._v("/")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("p",[t._v("Ajv also allows defining the formats that would be applied to numbers only:")]),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("addFormat")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"byte"')]),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 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("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("x")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("255")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("%")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),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 punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("h2",{attrs:{id:"formats-and-standalone-validation-code"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#formats-and-standalone-validation-code"}},[t._v("#")]),t._v(" Formats and standalone validation code")]),t._v(" "),a("p",[t._v("If you use formats from "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" package, "),a("a",{attrs:{href:"../standalone"}},[t._v("standalone validation code")]),t._v(" will be supported out of the box.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Standalone code and Ajv versions")]),t._v(" "),a("p",[t._v("You need to make sure that ajv-formats imports the same version and the same code of ajv as the one you use in your application for standalone validation code to work (because of "),a("code",[t._v("instanceof")]),t._v(" check that is currently used).")]),t._v(" "),a("p",[a("code",[t._v("npm")]),t._v(" and other package managers may not update the version of ajv dependency of ajv-formats when you update version of ajv in your application - the workaround is to use clean npm installation.")])]),t._v(" "),a("p",[t._v("If you define your own formats, for standalone code generation to work you need to pass the code snippet that evaluates to an object with all defined formats to the option "),a("code",[t._v("code.formats")]),t._v(":")]),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(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[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(" Ajv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),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 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(" 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("formats")]),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('require("./my_formats")')]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[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")])])])]),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 punctuation"}},[t._v(",")]),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(" "),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("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("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("formats"),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('require("./my_formats")')]),a("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[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")])])])])],1)],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/55.cd887e1c.js b/assets/js/55.cd887e1c.js new file mode 100644 index 000000000..c67ec74cd --- /dev/null +++ b/assets/js/55.cd887e1c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{401: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:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting started")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#install"}},[t._v("Install")])]),a("li",[a("a",{attrs:{href:"#basic-data-validation"}},[t._v("Basic data validation")])]),a("li",[a("a",{attrs:{href:"#parsing-and-serializing-json"}},[t._v("Parsing and serializing JSON "),a("Badge",{attrs:{text:"New"}})],1)])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"install"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Node REPL")]),t._v(" "),a("p",[t._v("You can try Ajv without installing it in the Node.js REPL: "),a("a",{attrs:{href:"https://runkit.com/npm/ajv",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://runkit.com/npm/ajv"),a("OutboundLink")],1)])]),t._v(" "),a("p",[t._v("To install Ajv version 8:")]),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(" ajv\n")])])]),a("p",[t._v("If you need to use Ajv with "),a("a",{attrs:{href:"./schema-language#draft-04"}},[t._v("JSON Schema draft-04")]),t._v(", you need to install Ajv version 6:")]),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(" ajv@6\n")])])]),a("p",[t._v("See "),a("RouterLink",{attrs:{to:"/CONTRIBUTING.html"}},[t._v("Contributing")]),t._v(" on how to run the tests locally")],1),t._v(" "),a("h2",{attrs:{id:"basic-data-validation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#basic-data-validation"}},[t._v("#")]),t._v(" Basic data validation")]),t._v(" "),a("p",[t._v("Ajv takes a schema for your JSON data and converts it into a very efficient JavaScript code\nthat validates your data according to the schema. To create a schema you can use either\n"),a("a",{attrs:{href:"../json-schema"}},[t._v("JSON Schema")]),t._v(" or "),a("a",{attrs:{href:"../json-type-definition"}},[t._v("JSON Type Definition")]),t._v(" - check out "),a("a",{attrs:{href:"./schema-language"}},[t._v("Choosing schema language")]),t._v(", they have\ndifferent advantages and disadvantages.")]),t._v(" "),a("p",[t._v('For example, to validate an object that has a required property "foo" (an integer number), an optional property "bar" (a string) and no other properties:')]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JSON Schema"}},[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"')]),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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// options can be passed, e.g. {allErrors: true}")]),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('"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('"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("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("}")]),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("}")]),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\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("1")]),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 string"}},[t._v('"abc"')]),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(" valid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),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(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("valid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),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("(")]),t._v("validate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),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-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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// options can be passed, e.g. {allErrors: true}")]),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("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('"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("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\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\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("1")]),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 string"}},[t._v('"abc"')]),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(" valid "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),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(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("valid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),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("(")]),t._v("validate"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("errors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("p",[t._v("Ajv compiles schemas to functions and caches them in all cases (using the schema itself as a key in a Map), so that the next time the same schema object is used it won't be compiled again.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Best performance: compile and getSchema methods")]),t._v(" "),a("p",[t._v("The best performance is achieved when using compiled functions returned by "),a("code",[t._v("compile")]),t._v(" or "),a("code",[t._v("getSchema")]),t._v(" methods.")]),t._v(" "),a("p",[t._v("While execution of the compiled validation function is very fast, its compilation is\nrelatively slow, so you need to make sure that you compile schemas only once and\nre-use compiled validation functions. See "),a("a",{attrs:{href:"./managing-schemas"}},[t._v("Managing multiple schemas")]),t._v(".")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Save errors property")]),t._v(" "),a("p",[t._v("Every time a validation function (or "),a("code",[t._v("ajv.validate")]),t._v(") is called the "),a("code",[t._v("errors")]),t._v(" property is overwritten. You need to copy the "),a("code",[t._v("errors")]),t._v(" array reference to another variable if you want to use it later (e.g. in the callback). See "),a("RouterLink",{attrs:{to:"/api.html#validation-errors"}},[t._v("Validation errors")]),t._v(".")],1)]),t._v(" "),a("h2",{attrs:{id:"parsing-and-serializing-json"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#parsing-and-serializing-json"}},[t._v("#")]),t._v(" Parsing and serializing JSON "),a("Badge",{attrs:{text:"New"}})],1),t._v(" "),a("p",[t._v("Ajv can compile efficient parsers and serializers from "),a("a",{attrs:{href:"../json-type-definition"}},[t._v("JSON Type Definition")]),t._v(" schemas.")]),t._v(" "),a("p",[t._v("Serializing the data with a function specialized to your data shape can be more than 10x compared with "),a("code",[t._v("JSON.stringify")]),t._v(".")]),t._v(" "),a("p",[t._v("Parsing the data replaces the need for separate validation after generic parsing with "),a("code",[t._v("JSON.parse")]),t._v(" (although validation itself is usually much faster than parsing). In case your JSON string is valid, the specialized parsing is approximately as fast as JSON.parse, but in case your JSON is invalid, the specialized parsing would fail much faster - so it can be very efficient in some scenarios.")]),t._v(" "),a("p",[t._v("For the same data structure, you can compile parser and serializer in this way:")]),t._v(" "),a("code-group",[a("code-block",{attrs:{title:"JSON Type Definition"}},[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(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// options can be passed, e.g. {allErrors: true}")]),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("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('"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("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\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" serialize "),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("compileSerializer")]),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\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("1")]),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 string"}},[t._v('"abc"')]),t._v("\n"),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("serialize")]),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("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" parse "),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("compileParser")]),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\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" json "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{"foo": 1, "bar": "abc"}\'')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invalidJson "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('\'{"unknown": "abc"}\'')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLog")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// logs {foo: 1, bar: "abc"}')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLog")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("invalidJson"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// logs error and position")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parseAndLog")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("json")]),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(" data "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),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 keyword"}},[t._v("undefined")]),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 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("(")]),t._v("parse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error message from the last parse call")]),t._v("\n 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("(")]),t._v("parse"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("position"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// error position in string")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n 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("(")]),t._v("data"),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")])])])])],1),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("Lower parsing performance of empty schemas")]),t._v(" "),a("p",[t._v("You would have smaller performance benefits in case your schema contains some properties or other parts that are empty schemas ("),a("code",[t._v("{}")]),t._v(") - parser would call "),a("code",[t._v("JSON.parse")]),t._v(" in this case.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("JTD discriminator schema")]),t._v(" "),a("p",[t._v("The performance of parsing discriminator schemas depends on the position of discriminator tag in the schema - the best parsing performance will be achieved if the tag is the first property - this is how compiled JTD serializers generate JSON in case of discriminator schemas.")]),t._v(" "),a("p",[t._v("Also, if discriminator tag were to be repeated in JSON, the second value would be ignored and the object still validated according to the first tag.")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Compiled parsers do NOT throw exceptions")]),t._v(" "),a("p",[t._v("Compiled parsers, unlike JSON.parse, do not throw the exception in case JSON string is not a valid JSON or in case data is invalid according to the schema. As soon as the parser determines that either JSON or data is invalid, it returns "),a("code",[t._v("undefined")]),t._v(" and reports error and position via parsers properties "),a("code",[t._v("message")]),t._v(" and "),a("code",[t._v("position")]),t._v(".")])])],1)}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/59.13896c85.js b/assets/js/59.13896c85.js new file mode 100644 index 000000000..f572d3e26 --- /dev/null +++ b/assets/js/59.13896c85.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{409: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/61.cdbb4ea0.js b/assets/js/61.cdbb4ea0.js new file mode 100644 index 000000000..c21066989 --- /dev/null +++ b/assets/js/61.cdbb4ea0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{410:function(e,t,a){"use strict";a.r(t);var r=a(14),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"why-use-ajv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-ajv"}},[e._v("#")]),e._v(" Why use AJV")]),e._v(" "),t("h2",{attrs:{id:"write-less-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#write-less-code"}},[e._v("#")]),e._v(" Write less code")]),e._v(" "),t("p",[t("strong",[e._v("Ensure your data is valid as soon as it's received")])]),e._v(" "),t("p",[e._v("Instead of having your data validation and sanitization logic written as lengthy code, you can declare the requirements to your data with concise, easy to read and cross-platform "),t("a",{attrs:{href:"https://json-schema.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Schema"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://jsontypedef.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("JSON Type Definition"),t("OutboundLink")],1),e._v(" specifications and validate the data as soon as it arrives to your application.")]),e._v(" "),t("p",[e._v("TypeScript users can use validation functions as type guards, having type level guarantee that if your data is validated - it is correct.")]),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(" and "),t("RouterLink",{attrs:{to:"/guide/typescript.html"}},[e._v("Using with TypeScript")])],1),e._v(" "),t("h2",{attrs:{id:"super-fast-secure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#super-fast-secure"}},[e._v("#")]),e._v(" Super fast & secure")]),e._v(" "),t("p",[t("strong",[e._v("Compiles your schemas to optimized JavaScript code")])]),e._v(" "),t("p",[e._v("Ajv generates code to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization.")]),e._v(" "),t("p",[e._v("Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ebdrup/json-schema-benchmark",target:"_blank",rel:"noopener noreferrer"}},[e._v("json-schema-benchmark"),t("OutboundLink")],1),e._v(" - 50% faster than the second place")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/pandastrike/jsck#benchmarks",target:"_blank",rel:"noopener noreferrer"}},[e._v("jsck benchmark"),t("OutboundLink")],1),e._v(" - 20-190% faster")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://rawgit.com/zaggino/z-schema/master/benchmark/results.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("z-schema benchmark"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("themis benchmark"),t("OutboundLink")],1)])]),e._v(" "),t("p",[e._v("Ajv was designed at the time when there were no validators fully complying with JSON Schema specification, aiming to achieve the best possibly validation performance via just-in-time compilation of JSON schemas to code. Ajv achieved both speed and rigour, but initially security was an afterthought - many security flaws have been fixed thanks to the reports from its users.")]),e._v(" "),t("p",[e._v("Ajv version 7 was rebuilt to have secure code generation embedded in its design as the primary objective - even if you use untrusted schemas (which is still not recommended) there are type-level guarantees against remote code execution.")]),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/codegen.html"}},[e._v("Code generation design")])],1),e._v(" "),t("h2",{attrs:{id:"multi-standard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#multi-standard"}},[e._v("#")]),e._v(" Multi-standard")]),e._v(" "),t("p",[t("strong",[e._v("Use JSON Type Definition or JSON Schema")])]),e._v(" "),t("p",[e._v("In addition to the multiple "),t("RouterLink",{attrs:{to:"/json-schema.html"}},[e._v("JSON Schema")]),e._v(" drafts, including the latest draft 2020-12, Ajv has support for "),t("RouterLink",{attrs:{to:"/json-type-definition.html"}},[e._v("JSON Type Definition")]),e._v(" - a new "),t("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC8927"),t("OutboundLink")],1),e._v(" that offers a much simpler alternative to JSON Schema. Designed to be well-aligned with type systems, JTD has tools for both validation and type code generation for multiple languages.")],1),e._v(" "),t("p",[e._v("Read more in "),t("RouterLink",{attrs:{to:"/guide/schema-language.html"}},[e._v("Choosing schema language")])],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/62.41f37764.js b/assets/js/62.41f37764.js new file mode 100644 index 000000000..874b2e84d --- /dev/null +++ b/assets/js/62.41f37764.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{408: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("h1",{attrs:{id:"json-schema"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-schema"}},[t._v("#")]),t._v(" JSON Schema")]),t._v(" "),a("p",[t._v("In a simple way, JSON Schema is an object with validation keywords.")]),t._v(" "),a("p",[t._v("The keywords and their values define what rules the data should satisfy to be valid.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#json-schema-versions"}},[t._v("JSON Schema versions")]),a("ul",[a("li",[a("a",{attrs:{href:"#draft-07"}},[t._v("draft-07 "),a("Badge",{attrs:{text:"default"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-2019-09"}},[t._v("draft-2019-09 "),a("Badge",{attrs:{text:"NEW"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-2020-12"}},[t._v("draft-2020-12 "),a("Badge",{attrs:{text:"BREAKING",type:"warning"}})],1)]),a("li",[a("a",{attrs:{href:"#draft-06"}},[t._v("draft-06")])]),a("li",[a("a",{attrs:{href:"#draft-04"}},[t._v("draft-04")])])])]),a("li",[a("a",{attrs:{href:"#openapi-support"}},[t._v("OpenAPI support")])]),a("li",[a("a",{attrs:{href:"#json-data-type"}},[t._v("JSON data type")]),a("ul",[a("li",[a("a",{attrs:{href:"#type"}},[t._v("type")])]),a("li",[a("a",{attrs:{href:"#nullable"}},[t._v("nullable "),a("Badge",{attrs:{text:"OpenAPI"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-numbers"}},[t._v("Keywords for numbers")]),a("ul",[a("li",[a("a",{attrs:{href:"#maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[t._v("maximum / minimum and exclusiveMaximum / exclusiveMinimum")])]),a("li",[a("a",{attrs:{href:"#multipleof"}},[t._v("multipleOf")])])])]),a("li",[a("a",{attrs:{href:"#keywords-for-strings"}},[t._v("Keywords for strings")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxlength-minlength"}},[t._v("maxLength / minLength")])]),a("li",[a("a",{attrs:{href:"#pattern"}},[t._v("pattern")])]),a("li",[a("a",{attrs:{href:"#format"}},[t._v("format")])])])]),a("li",[a("a",{attrs:{href:"#keywords-for-arrays"}},[t._v("Keywords for arrays")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxitems-minitems"}},[t._v("maxItems / minItems")])]),a("li",[a("a",{attrs:{href:"#uniqueitems"}},[t._v("uniqueItems")])]),a("li",[a("a",{attrs:{href:"#items"}},[t._v("items")]),a("ul",[a("li",[a("a",{attrs:{href:"#items-in-draft-04-06-07-and-2019-09"}},[t._v("items in draft-04, -06, -07 and -2019-09")])]),a("li",[a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items in draft-2020-12 "),a("Badge",{attrs:{text:"NEW"}})],1)])])]),a("li",[a("a",{attrs:{href:"#prefixitems"}},[t._v("prefixItems "),a("Badge",{attrs:{text:"NEW: draft 2020-12"}})],1)]),a("li",[a("a",{attrs:{href:"#additionalitems"}},[t._v("additionalItems")])]),a("li",[a("a",{attrs:{href:"#contains"}},[t._v("contains")])]),a("li",[a("a",{attrs:{href:"#maxcontains-mincontains"}},[t._v("maxContains / minContains "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#unevaluateditems"}},[t._v("unevaluatedItems "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-objects"}},[t._v("Keywords for objects")]),a("ul",[a("li",[a("a",{attrs:{href:"#maxproperties-minproperties"}},[t._v("maxProperties / minProperties")])]),a("li",[a("a",{attrs:{href:"#required"}},[t._v("required")])]),a("li",[a("a",{attrs:{href:"#properties"}},[t._v("properties")])]),a("li",[a("a",{attrs:{href:"#patternproperties"}},[t._v("patternProperties")])]),a("li",[a("a",{attrs:{href:"#additionalproperties"}},[t._v("additionalProperties")])]),a("li",[a("a",{attrs:{href:"#dependencies"}},[t._v("dependencies "),a("Badge",{attrs:{text:"deprecated in draft 2019-09",type:"warning"}})],1)]),a("li",[a("a",{attrs:{href:"#dependentrequired"}},[t._v("dependentRequired "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#dependentschemas"}},[t._v("dependentSchemas "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#propertynames"}},[t._v("propertyNames")])]),a("li",[a("a",{attrs:{href:"#unevaluatedproperties"}},[t._v("unevaluatedProperties "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1)]),a("li",[a("a",{attrs:{href:"#discriminator"}},[t._v("discriminator "),a("Badge",{attrs:{text:"NEW: OpenAPI"}})],1)])])]),a("li",[a("a",{attrs:{href:"#keywords-for-all-types"}},[t._v("Keywords for all types")]),a("ul",[a("li",[a("a",{attrs:{href:"#enum"}},[t._v("enum")])]),a("li",[a("a",{attrs:{href:"#const"}},[t._v("const")])])])]),a("li",[a("a",{attrs:{href:"#compound-keywords"}},[t._v("Compound keywords")]),a("ul",[a("li",[a("a",{attrs:{href:"#not"}},[t._v("not")])]),a("li",[a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")])]),a("li",[a("a",{attrs:{href:"#anyof"}},[t._v("anyOf")])]),a("li",[a("a",{attrs:{href:"#allof"}},[t._v("allOf")])]),a("li",[a("a",{attrs:{href:"#if-then-else"}},[t._v("if/then/else")])])])]),a("li",[a("a",{attrs:{href:"#metadata-keywords"}},[t._v("Metadata keywords")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"json-schema-versions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-schema-versions"}},[t._v("#")]),t._v(" JSON Schema versions")]),t._v(" "),a("h3",{attrs:{id:"draft-07"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-07"}},[t._v("#")]),t._v(" draft-07 "),a("Badge",{attrs:{text:"default"}})],1),t._v(" "),a("p",[t._v("This version is provided as default export:")]),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"')]),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"')]),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("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("draft-07 has better performance")]),t._v(" "),a("p",[t._v("Unless you need the new features of later versions, you would have more efficient generated code with this draft.")])]),t._v(" "),a("h3",{attrs:{id:"draft-2019-09"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-2019-09"}},[t._v("#")]),t._v(" draft-2019-09 "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("p",[t._v("Ajv supports all new keywords of JSON Schema draft-2019-09:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#unevaluatedproperties"}},[t._v("unevaluatedProperties")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#unevaluateditems"}},[t._v("unevaluatedItems")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#dependentrequired"}},[t._v("dependentRequired")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#dependentschemas"}},[t._v("dependentSchemas")])]),t._v(" "),a("li",[a("a",{attrs:{href:"#maxcontains--mincontains"}},[t._v("maxContains/minContains")])]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[t._v("$recursiveAnchor/$recursiveRef")])],1)]),t._v(" "),a("p",[t._v("To use draft-2019-09 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(" Ajv2019 "),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/2019"')]),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("Ajv2019")]),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(" 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 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")])])])])],1),t._v(" "),a("p",[t._v("You can use draft-07 schemas with this Ajv instance as well, draft-2019-09 is backwards compatible. If your schemas use "),a("code",[t._v("$schema")]),t._v(" keyword, you need to add draft-07 meta-schema to Ajv instance:")]),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(" draft7MetaSchema "),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/refs/json-schema-draft-07.json"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft7MetaSchema"),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(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" draft7MetaSchema "),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/refs/json-schema-draft-07.json"')]),t._v("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft7MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("h3",{attrs:{id:"draft-2020-12"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-2020-12"}},[t._v("#")]),t._v(" draft-2020-12 "),a("Badge",{attrs:{text:"BREAKING",type:"warning"}})],1),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("draft-2020-12 is not backwards compatible")]),t._v(" "),a("p",[t._v("You cannot use draft-2020-12 and previous JSON Schema versions in the same Ajv instance.")])]),t._v(" "),a("p",[t._v("Ajv supports all keywords of JSON Schema draft-2020-12:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" that replaced array form of items keyword")]),t._v(" "),a("li",[t._v("changed "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keyword that combined parts of functionality of items and additionalItems")]),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[t._v("$dynamicAnchor/$dynamicRef")])],1)]),t._v(" "),a("p",[t._v("To use draft-2020-12 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(" Ajv2020 "),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/2020"')]),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("Ajv2020")]),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(" Ajv2020 "),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/2020"')]),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("Ajv2020")]),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("h3",{attrs:{id:"draft-06"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-06"}},[t._v("#")]),t._v(" draft-06")]),t._v(" "),a("p",[t._v("You can use JSON Schema draft-06 schemas with Ajv v7/8. If your schemas use "),a("code",[t._v("$schema")]),t._v(" keyword, you need to add draft-06 meta-schema to Ajv instance. This example shows how to support both draft-06 and draft-07 schemas:")]),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"')]),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(" draft6MetaSchema "),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/refs/json-schema-draft-06.json"')]),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("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft6MetaSchema"),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"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" draft6MetaSchema "),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/refs/json-schema-draft-06.json"')]),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("\najv"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("addMetaSchema")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("draft6MetaSchema"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])],1),t._v(" "),a("h3",{attrs:{id:"draft-04"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#draft-04"}},[t._v("#")]),t._v(" draft-04")]),t._v(" "),a("p",[t._v("You can use JSON Schema draft-04 schemas with Ajv from v8.5.0 and the additional package "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-draft-04",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-draft-04"),a("OutboundLink")],1),t._v(" (both ajv and ajv-draft-04 should be installed).")]),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-draft-04"')]),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-draft-04"')]),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("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Ajv cannot combine multiple JSON Schema versions")]),t._v(" "),a("p",[t._v("You can only use this import with JSON Schema draft-04, you cannot combine multiple JSON Schema versions in this ajv instance.")])]),t._v(" "),a("h2",{attrs:{id:"openapi-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#openapi-support"}},[t._v("#")]),t._v(" OpenAPI support")]),t._v(" "),a("p",[t._v("Ajv supports these additional "),a("a",{attrs:{href:"https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenAPI specification"),a("OutboundLink")],1),t._v(" keywords:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"#nullable"}},[t._v("nullable")]),t._v(" - to avoid using "),a("code",[t._v("type")]),t._v(" keyword with array of types.")]),t._v(" "),a("li",[a("a",{attrs:{href:"#discriminator"}},[t._v("discriminator")]),t._v(" - to optimize validation and error reporting of tagged unions")])]),t._v(" "),a("h2",{attrs:{id:"json-data-type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#json-data-type"}},[t._v("#")]),t._v(" JSON data type")]),t._v(" "),a("h3",{attrs:{id:"type"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#type"}},[t._v("#")]),t._v(" "),a("code",[t._v("type")])]),t._v(" "),a("p",[a("code",[t._v("type")]),t._v(" keyword requires that the data is of certain type (or some of types). Its value can be a string (the allowed type) or an array of strings (multiple allowed types).")]),t._v(" "),a("p",[t._v("Type can be: "),a("code",[t._v("number")]),t._v(", "),a("code",[t._v("integer")]),t._v(", "),a("code",[t._v("string")]),t._v(", "),a("code",[t._v("boolean")]),t._v(", "),a("code",[t._v("array")]),t._v(", "),a("code",[t._v("object")]),t._v(" or "),a("code",[t._v("null")]),t._v(".")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("1.5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')]),t._v(", "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "integer"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("2")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')]),t._v(", "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: ["number", "string"]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"1"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("null")]),t._v(", "),a("code",[t._v("true")])])])]),t._v(" "),a("p",[t._v("All examples above are JSON Schemas that only require data to be of certain type to be valid.")]),t._v(" "),a("p",[t._v("Most other keywords apply only to a particular type of data. If the data is of different type, the keyword will not apply and the data will be considered valid.")]),t._v(" "),a("p",[t._v("In v7 Ajv introduced "),a("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")]),t._v(" mode that makes these mistakes less likely by requiring that types are constrained with type keyword whenever another keyword that applies to specific type is used.")],1),t._v(" "),a("h3",{attrs:{id:"nullable"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nullable"}},[t._v("#")]),t._v(" nullable "),a("Badge",{attrs:{text:"OpenAPI"}})],1),t._v(" "),a("p",[t._v("This keyword can be used to allow "),a("code",[t._v("null")]),t._v(" value in addition to the defined "),a("code",[t._v("type")]),t._v(".")]),t._v(" "),a("p",[t._v("Ajv supports it by default, without additional options. These two schemas are equivalent, but the first one is better supported by some tools and is also compatible with "),a("code",[t._v("strictTypes")]),t._v(" option (see "),a("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[t._v("Strict types")]),t._v(")")],1),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token 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 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")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("and")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),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('"string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"null"')]),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("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("nullable does not extend enum and const")]),t._v(" "),a("p",[t._v("If you use "),a("a",{attrs:{href:"#enum"}},[t._v("enum")]),t._v(" or "),a("a",{attrs:{href:"#const"}},[t._v("const")]),t._v(" keywords, "),a("code",[t._v('"nullable": true')]),t._v(" would not extend the list of allowed values - "),a("code",[t._v("null")]),t._v(" value has to be explicitly added to "),a("code",[t._v("enum")]),t._v(" (and "),a("code",[t._v("const")]),t._v(" would fail, unless it is "),a("code",[t._v('"const": null')]),t._v(")")]),t._v(" "),a("p",[t._v("This is different from how "),a("code",[t._v("nullable")]),t._v(" is defined in "),a("RouterLink",{attrs:{to:"/json-type-definition.html"}},[t._v("JSON Type Definition")]),t._v(", where "),a("code",[t._v('"nullable": true')]),t._v(" allows "),a("code",[t._v("null")]),t._v(" value in addition to any data defined by the schema.")],1)]),t._v(" "),a("h2",{attrs:{id:"keywords-for-numbers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-numbers"}},[t._v("#")]),t._v(" Keywords for numbers")]),t._v(" "),a("h3",{attrs:{id:"maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maximum-minimum-and-exclusivemaximum-exclusiveminimum"}},[t._v("#")]),t._v(" "),a("code",[t._v("maximum")]),t._v(" / "),a("code",[t._v("minimum")]),t._v(" and "),a("code",[t._v("exclusiveMaximum")]),t._v(" / "),a("code",[t._v("exclusiveMinimum")])]),t._v(" "),a("p",[t._v("The value of keyword "),a("code",[t._v("maximum")]),t._v(" ("),a("code",[t._v("minimum")]),t._v(") should be a number. This value is the maximum (minimum) allowed value for the data to be valid.")]),t._v(" "),a("p",[t._v("The value of keyword "),a("code",[t._v("exclusiveMaximum")]),t._v(" ("),a("code",[t._v("exclusiveMinimum")]),t._v(") should be a number. This value is the exclusive maximum (minimum) allowed value for the data to be valid (the data equal to this keyword value is invalid).")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("NO support for boolean keyword values")]),t._v(" "),a("p",[t._v("Boolean values for keywords "),a("code",[t._v("exclusiveMaximum")]),t._v(" ("),a("code",[t._v("exclusiveMinimum")]),t._v(") are not supported.")])]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", maximum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("6")]),t._v(", "),a("code",[t._v("7")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", minimum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("6")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("4.5")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", exclusiveMinimum: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("6")]),t._v(", "),a("code",[t._v("7")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5")])])])]),t._v(" "),a("h3",{attrs:{id:"multipleof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#multipleof"}},[t._v("#")]),t._v(" "),a("code",[t._v("multipleOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a number. The data to be valid should be a multiple of the keyword value (i.e. the result of division of the data on the value should be integer).")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", multipleOf: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("10")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("4")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", multipleOf: 2.5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("7.5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("4")])])])]),t._v(" "),a("h2",{attrs:{id:"keywords-for-strings"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-strings"}},[t._v("#")]),t._v(" Keywords for strings")]),t._v(" "),a("h3",{attrs:{id:"maxlength-minlength"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxlength-minlength"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxLength")]),t._v(" / "),a("code",[t._v("minLength")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data to be valid should have length satisfying this rule. Unicode pairs are counted as a single character.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", maxLength: 5}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"abc"')]),t._v(", "),a("code",[t._v('"abcde"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abcdef"')])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", minLength: 2}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"ab"')]),t._v(", "),a("code",[t._v('"😀😀"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"a"')]),t._v(", "),a("code",[t._v('"😀"')])])])]),t._v(" "),a("h3",{attrs:{id:"pattern"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pattern"}},[t._v("#")]),t._v(" "),a("code",[t._v("pattern")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a string. The data to be valid should match the regular expression defined by the keyword value.")]),t._v(" "),a("p",[t._v("Ajv uses "),a("code",[t._v('new RegExp(value, "u")')]),t._v(" to create the regular expression that will be used to test data.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", pattern: "[abc]+"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"a"')]),t._v(", "),a("code",[t._v('"abcd"')]),t._v(", "),a("code",[t._v('"cde"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"def"')]),t._v(", "),a("code",[t._v('""')])]),t._v(" "),a("h3",{attrs:{id:"format"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#format"}},[t._v("#")]),t._v(" "),a("code",[t._v("format")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a string. The data to be valid should match the format with this name.")]),t._v(" "),a("p",[t._v("Ajv does not include any formats, they can be added with "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),t._v(" plugin.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "string", format: "ipv4"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"192.168.0.1"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('"abc"')])]),t._v(" "),a("h2",{attrs:{id:"keywords-for-arrays"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-arrays"}},[t._v("#")]),t._v(" Keywords for arrays")]),t._v(" "),a("h3",{attrs:{id:"maxitems-minitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxitems-minitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxItems")]),t._v(" / "),a("code",[t._v("minItems")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data array to be valid should not have more (less) items than the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", maxItems: 3}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('["1", 2, "3"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[1, 2, 3, 4]")])]),t._v(" "),a("h3",{attrs:{id:"uniqueitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#uniqueitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("uniqueItems")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a boolean. If the keyword value is "),a("code",[t._v("true")]),t._v(", the data array to be valid should have unique items.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", uniqueItems: true}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('["1", 2, "3"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[1, 2, 1]")]),t._v(", "),a("code",[t._v("[{a: 1, b: 2}, {b: 2, a: 1}]")])]),t._v(" "),a("h3",{attrs:{id:"items"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")])]),t._v(" "),a("h4",{attrs:{id:"items-in-draft-04-06-07-and-2019-09"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items-in-draft-04-06-07-and-2019-09"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")]),t._v(" in draft-04, -06, -07 and -2019-09")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("items keyword changed in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("This section describes "),a("code",[t._v("items")]),t._v(" keyword in all JSON Schema versions prior to draft-2020-12.")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a schema or an array of schemas.")]),t._v(" "),a("p",[t._v("If the keyword value is a schema, then for the data array to be valid each item of the array should be valid according to the schema. In this case the "),a("code",[t._v("additionalItems")]),t._v(" keyword is ignored.")]),t._v(" "),a("p",[t._v("If the keyword value is an array, then items with indices less than the number of items in the keyword should be valid according to the schemas with the same indices. Whether additional items are valid will depend on "),a("code",[t._v("additionalItems")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", items: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1,2,3]")]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('[1,"abc"]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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('"integer"')]),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("}")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 2]')]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc", 1]')]),t._v(", "),a("code",[t._v('["abc"]')])])])]),t._v(" "),a("p",[t._v("The schema in example 2 will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("code",[t._v("minItems")]),t._v(" and "),a("code",[t._v("additionalItems")]),t._v(" keywords (see example 1 in "),a("code",[t._v("additionalItems")]),t._v(").")]),t._v(" "),a("h4",{attrs:{id:"items-in-draft-2020-12"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#items-in-draft-2020-12"}},[t._v("#")]),t._v(" "),a("code",[t._v("items")]),t._v(" in draft-2020-12 "),a("Badge",{attrs:{text:"NEW"}})],1),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("items keyword changed in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("This section describes "),a("code",[t._v("items")]),t._v(" keyword in JSON draft-2020-12.")])]),t._v(" "),a("p",[t._v("The value of the keyword must be a schema.")]),t._v(" "),a("p",[t._v("For the data array to be valid:")]),t._v(" "),a("ul",[a("li",[t._v("if "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" keyword is not used in the schema, then each item of the array must be valid according to the schema in "),a("code",[t._v("items")]),t._v(".")]),t._v(" "),a("li",[t._v("if "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" keyword is used in the schema, then each item with the index starting from the size of "),a("code",[t._v("prefixItems")]),t._v(" schema must be valid according to the schema in "),a("code",[t._v("items")])])]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", items: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1,2,3]")]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('[1,"abc"]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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("prefixItems")]),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('"integer"')]),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('"integer"')]),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")]),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 boolean"}},[t._v("false")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(" (any wrong number of items or wrong type)")])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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("prefixItems")]),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('"integer"')]),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('"integer"')]),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("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('"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("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('\n_valid_: `[1]`, `[1, "abc"]`, `[1, "abc", 2]`, `[]`\n\n_invalid_: `["abc", 1]`, `["abc"]`\n\n')])])])])]),t._v(" "),a("p",[t._v("The schema in example 3 will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("code",[t._v("minItems")]),t._v(" and "),a("code",[t._v("items")]),t._v(" keywords (see example 2).")]),t._v(" "),a("h3",{attrs:{id:"prefixitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#prefixitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("prefixItems")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2020-12"}})],1),t._v(" "),a("p",[t._v("The value of the keyword must be an array of schemas.")]),t._v(" "),a("p",[t._v("For the data array to be valid, the items with indices less than the number of schemas in this keyword must be valid according to the schemas with the same indices. Whether additional items are valid will depend on "),a("code",[t._v("items")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("prefixItems")]),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('"integer"')]),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("}")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 2]')]),t._v(", "),a("code",[t._v("[]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc", 1]')]),t._v(", "),a("code",[t._v('["abc"]')])]),t._v(" "),a("p",[t._v("The schema in example will log warning by default (see "),a("code",[t._v("strictTuples")]),t._v(" option), because it defines unconstrained tuple. To define a tuple with exactly 2 elements use "),a("a",{attrs:{href:"#minitems"}},[t._v("minItems")]),t._v(" and "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keywords (see example 2 in "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(").")]),t._v(" "),a("h3",{attrs:{id:"additionalitems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additionalitems"}},[t._v("#")]),t._v(" "),a("code",[t._v("additionalItems")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("additionalItems is not supported in JSON Schema draft-2020-12")]),t._v(" "),a("p",[t._v("To create and equivalent schema in draft-2020-12 use keywords "),a("a",{attrs:{href:"#prefixItems"}},[t._v("prefixItems")]),t._v(" and the new "),a("a",{attrs:{href:"#items-in-draft-2020-12"}},[t._v("items")]),t._v(" keyword")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a boolean or an object.")]),t._v(" "),a("p",[t._v("If "),a("code",[t._v("items")]),t._v(" keyword is not present or it is an object, "),a("code",[t._v("additionalItems")]),t._v(" keyword should be ignored regardless of its value. By default Ajv will throw exception in this case - see "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict mode")])],1),t._v(" "),a("p",[t._v("If "),a("code",[t._v("items")]),t._v(" keyword is an array and data array has not more items than the length of "),a("code",[t._v("items")]),t._v(" keyword value, "),a("code",[t._v("additionalItems")]),t._v(" keyword is also ignored.")]),t._v(" "),a("p",[t._v('If the length of data array is bigger than the length of "items" keyword value than the result of the validation depends on the value of '),a("code",[t._v("additionalItems")]),t._v(" keyword:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("false")]),t._v(": data is invalid")]),t._v(" "),a("li",[a("code",[t._v("true")]),t._v(": data is valid")]),t._v(" "),a("li",[t._v('an object: data is valid if all additional items (i.e. items with indices greater or equal than "items" keyword value length) are valid according to the schema in "additionalItems" keyword.')])]),t._v(" "),a("p",[t._v("The schemas in examples 2-3 log warning by default, use option "),a("code",[t._v("strictTuples: false")]),t._v(" to allow)")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),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("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('"integer"')]),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('"integer"')]),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")]),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")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, "abc"]')]),t._v(" (any wrong number of items or wrong type)")])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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('"integer"')]),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('"integer"')]),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("additionalItems")]),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",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v('[1, "abc", 3]')])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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('"integer"')]),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('"integer"')]),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("additionalItems")]),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("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, "abc"]')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('["abc"]')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])])])]),t._v(" "),a("h3",{attrs:{id:"contains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contains"}},[t._v("#")]),t._v(" "),a("code",[t._v("contains")])]),t._v(" "),a("p",[t._v("The value of the keyword is a JSON Schema. The array is valid if it contains at least one item that is valid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "array", contains: {type: "integer"}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1]")]),t._v(", "),a("code",[t._v('[1, "foo"]')]),t._v(", any array with at least one integer")]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('["foo", "bar"]')]),t._v(", any array without integers")]),t._v(" "),a("h3",{attrs:{id:"maxcontains-mincontains"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxcontains-mincontains"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxContains")]),t._v(" / "),a("code",[t._v("minContains")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of these keywords should be an integer.")]),t._v(" "),a("p",[t._v("Without "),a("code",[t._v("contains")]),t._v(" keyword they are ignored (logs error or throws exception in ajv "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("strict mode")]),t._v(").")],1),t._v(" "),a("p",[t._v("The array is valid if it contains at least "),a("code",[t._v("minContains")]),t._v(" items and no more than "),a("code",[t._v("maxContains")]),t._v(" items that are valid against the schema in "),a("code",[t._v("contains")]),t._v(" keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("contains")]),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("minContains")]),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("maxContains")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2]")]),t._v(", "),a("code",[t._v('[1, 2, 3, "foo"]')]),t._v(", any array with 2 or 3 integers")]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("[]")]),t._v(", "),a("code",[t._v('[1, "foo"]')]),t._v(", "),a("code",[t._v("[1, 2, 3, 4]")]),t._v(", any array with fewer than 2 or more than 3 integers")]),t._v(" "),a("h3",{attrs:{id:"unevaluateditems"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unevaluateditems"}},[t._v("#")]),t._v(" "),a("code",[t._v("unevaluatedItems")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema (can be a boolean).")]),t._v(" "),a("p",[t._v("This schema will be applied to all array items that were not evaluated by other keywords for items ("),a("code",[t._v("items")]),t._v(", "),a("code",[t._v("additionalItems")]),t._v(" and "),a("code",[t._v("contains")]),t._v(") in the current schema and all sub-schemas that were valid for this data instance. It includes:")]),t._v(" "),a("ul",[a("li",[t._v("all subschemas schemas in "),a("code",[t._v("allOf")]),t._v(" and "),a("code",[t._v("$ref")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("valid sub-schemas in "),a("code",[t._v("oneOf")]),t._v(" and "),a("code",[t._v("anyOf")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("sub-schema in "),a("code",[t._v("if")]),t._v(" keyword")]),t._v(" "),a("li",[t._v("sub-schemas in "),a("code",[t._v("then")]),t._v(" or "),a("code",[t._v("else")]),t._v(" keywords that were applied based on the validation result by "),a("code",[t._v("if")]),t._v(" keyword.")])]),t._v(" "),a("p",[t._v("The only scenario when this keyword would be applied to some items is when "),a("code",[t._v("items")]),t._v(" keyword value is an array of schemas and "),a("code",[t._v("additionalItems")]),t._v(" was not present (or did not apply, in case it was present in some invalid subschema).")]),t._v(" "),a("p",[t._v('Some user-defined keywords can also make items "evaluated".')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("[")]),t._v("\n "),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 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("unevaluatedItems")]),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("anyOf")]),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("{")]),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 boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[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 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("}")]),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 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 boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[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 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("]")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("[1, 2, 3]")]),t._v(", "),a("code",[t._v("[1, 2, true]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("[1, 2]")]),t._v(" - the third item is not present")]),t._v(" "),a("li",[a("code",[t._v('[1, 2, "3"]')]),t._v(' - the third item is "unevaluated"')])]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedItems.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("tests"),a("OutboundLink")],1),t._v(" for "),a("code",[t._v("unevaluatedItems")]),t._v(" keyword for other examples.")]),t._v(" "),a("h2",{attrs:{id:"keywords-for-objects"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-objects"}},[t._v("#")]),t._v(" Keywords for objects")]),t._v(" "),a("h3",{attrs:{id:"maxproperties-minproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#maxproperties-minproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("maxProperties")]),t._v(" / "),a("code",[t._v("minProperties")])]),t._v(" "),a("p",[t._v("The value of the keywords should be a number. The data object to be valid should have not more (less) properties than the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "object", maxProperties: 2 }')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")]),t._v(", "),a("code",[t._v('{a: "1", b: 2}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 1, b: 2, c: 3}")])]),t._v(" "),a("h3",{attrs:{id:"required"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#required"}},[t._v("#")]),t._v(" "),a("code",[t._v("required")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of unique strings. The data object to be valid should contain all properties with names equal to the elements in the keyword value.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "object", required: ["a", "b"]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{a: 1, b: 2}")]),t._v(", "),a("code",[t._v("{a: 1, b: 2, c: 3}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")]),t._v(", "),a("code",[t._v("{c: 3, d: 4}")])]),t._v(" "),a("h3",{attrs:{id:"properties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#properties"}},[t._v("#")]),t._v(" "),a("code",[t._v("properties")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema. For data object to be valid the corresponding values in data object properties should be valid according to these schemas.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Properties are not required")]),t._v(" "),a("p",[a("code",[t._v("properties")]),t._v(" keyword does not require that the properties mentioned in it are present in the object (see examples).")])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("{")]),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("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "a"}')]),t._v(", "),a("code",[t._v('{foo: "a", bar: 2}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "a", bar: 1}')])]),t._v(" "),a("h3",{attrs:{id:"patternproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#patternproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("patternProperties")])]),t._v(" "),a("p",[t._v("The value of this keyword should be a map where keys should be regular expressions and the values should be JSON Schemas. For data object to be valid the values in data object properties that match regular expression(s) should be valid according to the corresponding schema(s).")]),t._v(" "),a("p",[t._v("When the value in data object property matches multiple regular expressions it should be valid according to all the schemas for all matched regular expressions.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Unexpected validation results")]),t._v(" "),a("ol",[a("li",[a("code",[t._v("patternProperties")]),t._v(" keyword does not require that properties matching patterns are present in the object (see examples).")]),t._v(" "),a("li",[t._v("By default, Ajv does not allow schemas where patterns in "),a("code",[t._v("patternProperties")]),t._v(" match any property name in "),a("code",[t._v("properties")]),t._v(" keyword - that leads to unexpected validation results. It can be allowed with option "),a("code",[t._v("allowMatchingProperties")]),t._v(". See "),a("RouterLink",{attrs:{to:"/strict-mode.html"}},[t._v("Strict mode")])],1)])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("patternProperties")]),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('"^fo.*$"')]),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 string-property property"}},[t._v('"^ba.*$"')]),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("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{foo: "a"}')]),t._v(", "),a("code",[t._v('{foo: "a", bar: 1}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v('{foo: "a", bar: "b"}')])]),t._v(" "),a("h3",{attrs:{id:"additionalproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#additionalproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("additionalProperties")])]),t._v(" "),a("p",[t._v("The value of the keyword should be either a boolean or a JSON Schema.")]),t._v(" "),a("p",[t._v("If the value is "),a("code",[t._v("true")]),t._v(" the keyword is ignored.")]),t._v(" "),a("p",[t._v("If the value is "),a("code",[t._v("false")]),t._v(' the data object to be valid should not have "additional properties" (i.e. properties other than those used in "properties" keyword and those that match patterns in "patternProperties" keyword).')]),t._v(" "),a("p",[t._v('If the value is a schema for the data object to be valid the values in all "additional properties" should be valid according to this schema.')]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),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("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("}")]),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("patternProperties")]),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('"^.*r$"')]),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",[a("em",[t._v("valid")]),t._v(": "),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",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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("}")]),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("patternProperties")]),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('"^.*r$"')]),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 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("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v('{a: "b"}')]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v('{foo: 1, bar: 2, a: "b"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{a: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema")]),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("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("}")]),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("anyOf")]),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("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('"number"')]),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 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('"number"')]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{bar: 2}")]),t._v(", "),a("code",[t._v("{baz: 3}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", etc.")])])]),t._v(" "),a("h3",{attrs:{id:"dependencies"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependencies")]),t._v(" "),a("Badge",{attrs:{text:"deprecated in draft 2019-09",type:"warning"}})],1),t._v(" "),a("p",[t._v("This keyword is deprecated. The same functionality is available with keywords "),a("code",[t._v("dependentRequired")]),t._v(" and "),a("code",[t._v("dependentSchemas")]),t._v(".")]),t._v(" "),a("p",[t._v('The value of the keyword is a map with keys equal to data object properties. Each value in the map should be either an array of unique property names ("property dependency" - see '),a("a",{attrs:{href:"#%60dependentrequired%60"}},[a("code",[t._v("dependentRequired")])]),t._v(' keyword) or a JSON Schema ("schema dependency" - see '),a("a",{attrs:{href:"#%60dependentschemas%60"}},[a("code",[t._v("dependentSchemas")])]),t._v(" keyword).")]),t._v(" "),a("p",[t._v("For property dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the array of properties.")]),t._v(" "),a("p",[t._v("For schema dependency, if the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the schema.")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema (property dependency)")]),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("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("dependencies")]),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 string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[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("]")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])])]),t._v(" "),a("li",[a("p",[a("em",[t._v("schema (schema dependency)")]),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("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("dependencies")]),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("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('"number"')]),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("em",[t._v("valid")]),t._v(": "),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("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: 1, bar: "a"}')])])])]),t._v(" "),a("h3",{attrs:{id:"dependentrequired"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependentrequired"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependentRequired")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword should be a map with keys equal to data object properties. Each value in the map should be an array of unique property names.")]),t._v(" "),a("p",[t._v("If the data object contains a property that is a key in the keyword value, then to be valid the data object should also contain all properties from the corresponding array of properties in this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("dependentRequired")]),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 string"}},[t._v('"bar"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[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("]")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")]),t._v(", "),a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 3}")])]),t._v(" "),a("h3",{attrs:{id:"dependentschemas"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#dependentschemas"}},[t._v("#")]),t._v(" "),a("code",[t._v("dependentSchemas")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of the keyword should be a map with keys equal to data object properties. Each value in the map should be a JSON Schema.")]),t._v(" "),a("p",[t._v("If the data object contains a property that is a key in the keyword value, then to be valid the data object itself (NOT the property value) should be valid according to the corresponding schema in this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("dependentSchemas")]),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("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('"number"')]),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("em",[t._v("valid")]),t._v(": "),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("code",[t._v("{a: 1}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: 1, bar: "a"}')])]),t._v(" "),a("h3",{attrs:{id:"propertynames"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#propertynames"}},[t._v("#")]),t._v(" "),a("code",[t._v("propertyNames")])]),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema.")]),t._v(" "),a("p",[t._v("For data object to be valid each property name in this object should be valid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(" (requires "),a("code",[t._v("email")]),t._v(" format from "),a("a",{attrs:{href:"https://github.com/ajv-validator/ajv-formats",target:"_blank",rel:"noopener noreferrer"}},[t._v("ajv-formats"),a("OutboundLink")],1),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("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("propertyNames")]),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("format")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v('{"foo@bar.com": "any", "bar@bar.com": "any"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v('{foo: "any value"}')])]),t._v(" "),a("h3",{attrs:{id:"unevaluatedproperties"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#unevaluatedproperties"}},[t._v("#")]),t._v(" "),a("code",[t._v("unevaluatedProperties")]),t._v(" "),a("Badge",{attrs:{text:"NEW: draft 2019-09"}})],1),t._v(" "),a("p",[t._v("The value of this keyword is a JSON Schema (can be a boolean).")]),t._v(" "),a("p",[t._v("This schema will be applied to all properties that were not evaluated by other keywords for properties ("),a("code",[t._v("properties")]),t._v(", "),a("code",[t._v("patternProperties")]),t._v(" and "),a("code",[t._v("additionalProperties")]),t._v(") in the current schema and all sub-schemas that were valid for this data instance. It includes:")]),t._v(" "),a("ul",[a("li",[t._v("all subschemas schemas in "),a("code",[t._v("allOf")]),t._v(" and "),a("code",[t._v("$ref")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("valid sub-schemas in "),a("code",[t._v("oneOf")]),t._v(" and "),a("code",[t._v("anyOf")]),t._v(" keywords")]),t._v(" "),a("li",[t._v("sub-schema in "),a("code",[t._v("if")]),t._v(" keyword")]),t._v(" "),a("li",[t._v("sub-schemas in "),a("code",[t._v("then")]),t._v(" or "),a("code",[t._v("else")]),t._v(" keywords that were applied based on the validation result by "),a("code",[t._v("if")]),t._v(" keyword.")])]),t._v(" "),a("p",[t._v('Some user-defined keywords can also make properties "evaluated".')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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('"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("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("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("}")]),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 literal-property property"}},[t._v("anyOf")]),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("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("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("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('"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 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('"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 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("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('"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",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, baz: 2}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2, baz: 3}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 1}")]),t._v(" - neither "),a("code",[t._v("bar")]),t._v(" nor "),a("code",[t._v("baz")]),t._v(" are present")]),t._v(" "),a("li",[a("code",[t._v("{foo: 1, bar: 2, boo: 3}")]),t._v(" - "),a("code",[t._v("boo")]),t._v(" is unevaluated")]),t._v(" "),a("li",[a("code",[t._v('{foo: 1, bar: 2, baz: "3"}')]),t._v(" - not valid against the 2nd subschema, so "),a("code",[t._v("baz")]),t._v(' is "unevaluated".')])]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft2019-09/unevaluatedProperties.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("tests"),a("OutboundLink")],1),t._v(" for "),a("code",[t._v("unevaluatedProperties")]),t._v(" keyword for other examples.")]),t._v(" "),a("h3",{attrs:{id:"discriminator"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#discriminator"}},[t._v("#")]),t._v(" discriminator "),a("Badge",{attrs:{text:"NEW: OpenAPI"}})],1),t._v(" "),a("p",[t._v("Ajv has a limited support for "),a("code",[t._v("discriminator")]),t._v(" keyword: to optimize validation, error handling, and "),a("RouterLink",{attrs:{to:"/guide/modifying-data.html"}},[t._v("modifying data")]),t._v(" with "),a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")]),t._v(" keyword.")],1),t._v(" "),a("p",[t._v("Its value should be an object with a property "),a("code",[t._v("propertyName")]),t._v(" - the name of the property used to discriminate between union members.")]),t._v(" "),a("p",[t._v("When using discriminator keyword only one subschema in "),a("code",[t._v("oneOf")]),t._v(" will be used, determined by the value of discriminator property.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Use option discriminator")]),t._v(" "),a("p",[t._v("To use "),a("code",[t._v("discriminator")]),t._v(" keyword you have to use option "),a("code",[t._v("discriminator: true")]),t._v(" with Ajv constructor - it is not enabled by default.")])]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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('"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("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("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 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('"x"')]),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("a")]),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 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('"a"')]),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("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 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('"y"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"z"')]),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("b")]),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 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('"b"')]),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",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('{foo: "x", a: "any"}')]),t._v(", "),a("code",[t._v('{foo: "y", b: "any"}')]),t._v(", "),a("code",[t._v('{foo: "z", b: "any"}')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{}")]),t._v(", "),a("code",[t._v("{foo: 1}")]),t._v(" - discriminator tag must be string")]),t._v(" "),a("li",[a("code",[t._v('{foo: "bar"}')]),t._v(" - discriminator tag value must be in oneOf subschema")]),t._v(" "),a("li",[a("code",[t._v('{foo: "x", b: "b"}')]),t._v(", "),a("code",[t._v('{foo: "y", a: "a"}')]),t._v(" - invalid object")])]),t._v(" "),a("p",[t._v("From the perspective of validation result "),a("code",[t._v("discriminator")]),t._v(" is defined as no-op (that is, removing discriminator will not change the validity of the data), but errors reported in case of invalid data will be different.")]),t._v(" "),a("p",[t._v("There are following requirements and limitations of using "),a("code",[t._v("discriminator")]),t._v(" keyword:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("mapping")]),t._v(" in discriminator object is not supported.")]),t._v(" "),a("li",[a("a",{attrs:{href:"#oneof"}},[t._v("oneOf")]),t._v(" keyword must be present in the same schema.")]),t._v(" "),a("li",[t._v("discriminator property should be "),a("a",{attrs:{href:"#required"}},[t._v("required")]),t._v(" either on the top level, as in the example, or in all "),a("code",[t._v("oneOf")]),t._v(" subschemas.")]),t._v(" "),a("li",[t._v("each "),a("code",[t._v("oneOf")]),t._v(" subschema must have "),a("a",{attrs:{href:"#properties"}},[t._v("properties")]),t._v(" keyword with discriminator property. The subschemas should be either inlined or included as direct references (only "),a("code",[t._v("$ref")]),t._v(" keyword without any extra keywords is allowed).")]),t._v(" "),a("li",[t._v("schema for discriminator property in each "),a("code",[t._v("oneOf")]),t._v(" subschema must be "),a("a",{attrs:{href:"#const"}},[t._v("const")]),t._v(" or "),a("a",{attrs:{href:"#enum"}},[t._v("enum")]),t._v(", with unique values across all subschemas.")])]),t._v(" "),a("p",[t._v("Not meeting any of these requirements would fail schema compilation.")]),t._v(" "),a("h2",{attrs:{id:"keywords-for-all-types"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keywords-for-all-types"}},[t._v("#")]),t._v(" Keywords for all types")]),t._v(" "),a("h3",{attrs:{id:"enum"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enum"}},[t._v("#")]),t._v(" "),a("code",[t._v("enum")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of unique items of any types. The data is valid if it is deeply equal to one of items in the array.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{enum: [2, "foo", {foo: "bar" }, [1, 2, 3]]}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v('"foo"')]),t._v(", "),a("code",[t._v('{foo: "bar"}')]),t._v(", "),a("code",[t._v("[1, 2, 3]")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v('"bar"')]),t._v(", "),a("code",[t._v('{foo: "baz"}')]),t._v(", "),a("code",[t._v("[1, 2, 3, 4]")]),t._v(", any value not in enum")]),t._v(" "),a("h3",{attrs:{id:"const"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#const"}},[t._v("#")]),t._v(" "),a("code",[t._v("const")])]),t._v(" "),a("p",[t._v("The value of this keyword can be anything. The data is valid if it is deeply equal to the value of the keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{const: "foo"}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v('"foo"')])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": any other value")]),t._v(" "),a("p",[t._v("The same can be achieved with "),a("code",[t._v("enum")]),t._v(" keyword using the array with one item. But "),a("code",[t._v("const")]),t._v(" keyword is more than just a syntax sugar for "),a("code",[t._v("enum")]),t._v(". In combination with the "),a("RouterLink",{attrs:{to:"/guide/combining-schemas.html#data-reference"}},[t._v("$data reference")]),t._v(" it allows to define equality relations between different parts of the data. This cannot be achieved with "),a("code",[t._v("enum")]),t._v(" keyword even with "),a("code",[t._v("$data")]),t._v(" reference because "),a("code",[t._v("$data")]),t._v(" cannot be used in place of one item - it can only be used in place of the whole array in "),a("code",[t._v("enum")]),t._v(" keyword.")],1),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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 keyword"}},[t._v("const")]),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/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 punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("{foo: 1, bar: 1}")]),t._v(", "),a("code",[t._v("{}")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("{foo: 1}")]),t._v(", "),a("code",[t._v("{bar: 1}")]),t._v(", "),a("code",[t._v("{foo: 1, bar: 2}")])]),t._v(" "),a("h2",{attrs:{id:"compound-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#compound-keywords"}},[t._v("#")]),t._v(" Compound keywords")]),t._v(" "),a("h3",{attrs:{id:"not"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#not"}},[t._v("#")]),t._v(" "),a("code",[t._v("not")])]),t._v(" "),a("p",[t._v("The value of the keyword should be a JSON Schema. The data is valid if it is invalid according to this schema.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),t._v(": "),a("code",[t._v('{type: "number", not: {minimum: 3}}')])]),t._v(" "),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("2")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4")])]),t._v(" "),a("h3",{attrs:{id:"oneof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oneof"}},[t._v("#")]),t._v(" "),a("code",[t._v("oneOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of JSON Schemas. The data is valid if it matches exactly one JSON Schema from this array. Validators have to validate data against all schemas to establish validity according to this keyword.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("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("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),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 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 punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"anyof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#anyof"}},[t._v("#")]),t._v(" "),a("code",[t._v("anyOf")])]),t._v(" "),a("p",[t._v('The value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to one or more JSON Schemas in this array. Validators only need to validate data against schemas in order until the first schema matches (or until all schemas have been tried). For this reason validating against this keyword is faster than against "oneOf" keyword in most cases.')]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("anyOf")]),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("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),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 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 punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("3")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("5")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"allof"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#allof"}},[t._v("#")]),t._v(" "),a("code",[t._v("allOf")])]),t._v(" "),a("p",[t._v("The value of the keyword should be an array of JSON Schemas. The data is valid if it is valid according to all JSON Schemas in this array.")]),t._v(" "),a("p",[a("strong",[t._v("Example")])]),t._v(" "),a("p",[a("em",[t._v("schema")]),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("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("allOf")]),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("maximum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),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 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 punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(": "),a("code",[t._v("2")]),t._v(", "),a("code",[t._v("3")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(": "),a("code",[t._v("1.5")]),t._v(", "),a("code",[t._v("2.5")]),t._v(", "),a("code",[t._v("4")]),t._v(", "),a("code",[t._v("4.5")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("5.5")])]),t._v(" "),a("h3",{attrs:{id:"if-then-else"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#if-then-else"}},[t._v("#")]),t._v(" "),a("code",[t._v("if")]),t._v("/"),a("code",[t._v("then")]),t._v("/"),a("code",[t._v("else")])]),t._v(" "),a("p",[t._v("These keywords allow to implement conditional validation. Their values should be valid JSON Schemas (object or boolean).")]),t._v(" "),a("p",[t._v("If "),a("code",[t._v("if")]),t._v(" keyword is absent, the validation succeeds.")]),t._v(" "),a("p",[t._v("If the data is valid against the sub-schema in "),a("code",[t._v("if")]),t._v(" keyword, then the validation result is equal to the result of data validation against the sub-schema in "),a("code",[t._v("then")]),t._v(" keyword (if "),a("code",[t._v("then")]),t._v(" is absent, the validation succeeds).")]),t._v(" "),a("p",[t._v("If the data is invalid against the sub-schema in "),a("code",[t._v("if")]),t._v(" keyword, then the validation result is equal to the result of data validation against the sub-schema in "),a("code",[t._v("else")]),t._v(" keyword (if "),a("code",[t._v("else")]),t._v(" is absent, the validation succeeds).")]),t._v(" "),a("p",[a("strong",[t._v("Examples")])]),t._v(" "),a("ol",[a("li",[a("p",[a("em",[t._v("schema")]),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("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 keyword"}},[t._v("if")]),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("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("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("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),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 literal-property property"}},[t._v("then")]),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("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 keyword"}},[t._v("else")]),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("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('"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("}")]),t._v("\n")])])]),a("p",[a("em",[t._v("valid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 10, bar: true }")])]),t._v(" "),a("li",[a("code",[t._v("{}")])]),t._v(" "),a("li",[a("code",[t._v("{foo: 1, baz: true }")])])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("{foo: 10}")]),t._v(" ("),a("code",[t._v("bar")]),t._v(" is required)")]),t._v(" "),a("li",[a("code",[t._v("{foo: 10, baz: true }")]),t._v(" ("),a("code",[t._v("bar")]),t._v(" is required)")]),t._v(" "),a("li",[a("code",[t._v("{foo: 1}")]),t._v(" ("),a("code",[t._v("baz")]),t._v(" is required)")])])])]),t._v(" "),a("ol",{attrs:{start:"2"}},[a("li",[a("p",[a("em",[t._v("schema")]),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("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 literal-property property"}},[t._v("minimum")]),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 "),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 number"}},[t._v("1000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),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("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),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("then")]),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("multipleOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),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("else")]),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 keyword"}},[t._v("if")]),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("minimum")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),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("then")]),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("multipleOf")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),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("em",[t._v("valid")]),t._v(": "),a("code",[t._v("1")]),t._v(", "),a("code",[t._v("5")]),t._v(", "),a("code",[t._v("10")]),t._v(", "),a("code",[t._v("20")]),t._v(", "),a("code",[t._v("50")]),t._v(", "),a("code",[t._v("100")]),t._v(", "),a("code",[t._v("200")]),t._v(", "),a("code",[t._v("500")]),t._v(", "),a("code",[t._v("1000")])]),t._v(" "),a("p",[a("em",[t._v("invalid")]),t._v(":")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("-1")]),t._v(", "),a("code",[t._v("0")]),t._v(" (<1)")]),t._v(" "),a("li",[a("code",[t._v("2000")]),t._v(" (>1000)")]),t._v(" "),a("li",[a("code",[t._v("11")]),t._v(", "),a("code",[t._v("57")]),t._v(", "),a("code",[t._v("123")]),t._v(" (any integer with more than one non-zero digit)")]),t._v(" "),a("li",[t._v("non-integers")])])])]),t._v(" "),a("h2",{attrs:{id:"metadata-keywords"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#metadata-keywords"}},[t._v("#")]),t._v(" Metadata keywords")]),t._v(" "),a("p",[t._v("JSON Schema specification defines several metadata keywords that describe the schema itself but do not perform any validation.")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("title")]),t._v(" and "),a("code",[t._v("description")]),t._v(": information about the data represented by that schema")]),t._v(" "),a("li",[a("code",[t._v("$comment")]),t._v(": information for developers. With option "),a("code",[t._v("$comment")]),t._v(" Ajv logs or passes the comment string to the user-supplied function. See "),a("RouterLink",{attrs:{to:"/api.html#options"}},[t._v("Options")]),t._v(".")],1),t._v(" "),a("li",[a("code",[t._v("default")]),t._v(": a default value of the data instance, see "),a("RouterLink",{attrs:{to:"/guide/modifying-data.html#assigning-defaults"}},[t._v("Assigning defaults")]),t._v(".")],1),t._v(" "),a("li",[a("code",[t._v("examples")]),t._v(": an array of data instances. Ajv does not check the validity of these instances against the schema.")]),t._v(" "),a("li",[a("code",[t._v("readOnly")]),t._v(" and "),a("code",[t._v("writeOnly")]),t._v(": marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.).")]),t._v(" "),a("li",[a("code",[t._v("contentEncoding")]),t._v(": "),a("a",{attrs:{href:"https://tools.ietf.org/html/rfc2045#section-6.1",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC 2045"),a("OutboundLink")],1),t._v(', e.g., "base64".')]),t._v(" "),a("li",[a("code",[t._v("contentMediaType")]),t._v(": "),a("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc2046/",target:"_blank",rel:"noopener noreferrer"}},[t._v("RFC 2046"),a("OutboundLink")],1),t._v(', e.g., "image/png".')])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("Ignored keywords")]),t._v(" "),a("p",[t._v("Ajv does not implement validation of the keywords "),a("code",[t._v("examples")]),t._v(", "),a("code",[t._v("contentEncoding")]),t._v(" and "),a("code",[t._v("contentMediaType")]),t._v(" but it reserves them. If you want to create a plugin that implements any of them, it should remove these keywords from the instance.")])])],1)}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/63.f8b2c276.js b/assets/js/63.f8b2c276.js new file mode 100644 index 000000000..77c607c5b --- /dev/null +++ b/assets/js/63.f8b2c276.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{412: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/84.454418cc.js b/assets/js/84.454418cc.js new file mode 100644 index 000000000..b8c328ecc --- /dev/null +++ b/assets/js/84.454418cc.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{431:function(e,t,a){"use strict";a.r(t);var n=a(14),r=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"what-users-say"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-users-say"}},[e._v("#")]),e._v(" What users say")]),e._v(" "),t("p",[e._v("In the past 6 years of working on the JSON Schema Specification itself, Ajv stands out as the implementation of choice. It is very well documented and provides a rich API for extending JSON Schema which many thousands of people use in production today. A huge effort was put into testing, with many tests now forming part of the official test suite.")]),e._v(" "),t("p",[e._v("I've personally used Ajv in production to validate requests for a federated undiagnosed genetic disease program that has lead to new scientific discoveries and literally changed lives.")]),e._v(" "),t("p",[e._v("Ajv development can inform the future tooling and specification changes. There's no doubt that Ajv is partly responsible for the ubiquity and success of JSON Schema.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/relequestual",target:"_blank",rel:"noopener noreferrer"}},[e._v("Ben Hutton"),t("OutboundLink")],1),e._v(", JSON Schema Specification Lead")]),e._v(" "),t("br"),e._v(" "),t("p",[t("a",{attrs:{href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("ESLint"),t("OutboundLink")],1),e._v(" has used Ajv for validating our complex configurations. Ajv has proven to be reliable over the years we’ve been using it and ESLint is proud to sponsor Ajv’s continued development.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/nzakas",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nicholas C. Zakas"),t("OutboundLink")],1),e._v(", ESLint creator and TSC member")]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("I always thought that built-in data validation is a key feature of any web framework. We decided to leverage JSON Schema in "),t("a",{attrs:{href:"https://www.fastify.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("Fastify"),t("OutboundLink")],1),e._v(", and Ajv fits our needs wonderfully: it’s fast, stable and well maintained.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/mcollina",target:"_blank",rel:"noopener noreferrer"}},[e._v("Matteo Collina"),t("OutboundLink")],1),e._v(", technical Director "),t("a",{attrs:{href:"https://github.com/nearform",target:"_blank",rel:"noopener noreferrer"}},[e._v("@nearform"),t("OutboundLink")],1),e._v(" and TSC member")]),e._v(" "),t("br"),e._v(" "),t("p",[e._v("Ajv has become a centerpiece of all data-validation logic in my open-source projects and businesses. It is spec-compliant, extensible, fast and has amazing support.")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/gajus",target:"_blank",rel:"noopener noreferrer"}},[e._v("Gajus Kuizinas"),t("OutboundLink")],1),e._v(", Tech / Product Founder – building\n"),t("a",{attrs:{href:"https://twitter.com/contrahq",target:"_blank",rel:"noopener noreferrer"}},[e._v("@contrahq"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/85.2af51465.js b/assets/js/85.2af51465.js new file mode 100644 index 000000000..d6dfdb5ee --- /dev/null +++ b/assets/js/85.2af51465.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{432:function(e,t,a){"use strict";a.r(t);var i=a(14),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"changes-from-ajv-v6-12-6-to-v8-0-0"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#changes-from-ajv-v6-12-6-to-v8-0-0"}},[e._v("#")]),e._v(" Changes from Ajv v6.12.6 to v8.0.0")]),e._v(" "),t("p",[e._v("If you are migrating from v7 see "),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("v8.0.0 release notes"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#new-features"}},[e._v("New features")])]),t("li",[t("a",{attrs:{href:"#better-typescript-support"}},[e._v("Better TypeScript support")])]),t("li",[t("a",{attrs:{href:"#potential-migration-difficulties"}},[e._v("Potential migration difficulties")])]),t("li",[t("a",{attrs:{href:"#api-changes"}},[e._v("API changes")]),t("ul",[t("li",[t("a",{attrs:{href:"#added-options"}},[e._v("Added options")])]),t("li",[t("a",{attrs:{href:"#changed-options"}},[e._v("Changed options")])]),t("li",[t("a",{attrs:{href:"#removed-options"}},[e._v("Removed options")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"new-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-features"}},[e._v("#")]),e._v(" New features")]),e._v(" "),t("ul",[t("li",[e._v("support new schema specifications:\n"),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/json-type-definition.html"}},[e._v("JSON Type Definition")]),e._v(" "),t("a",{attrs:{href:"https://datatracker.ietf.org/doc/rfc8927/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RFC8927"),t("OutboundLink")],1),e._v(". See "),t("a",{attrs:{href:"https://ajv.js.org/guide/schema-language.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("choosing schema language"),t("OutboundLink")],1),e._v(" for comparison with JSON Schema.")],1),e._v(" "),t("li",[e._v("JSON Schema draft-2020-12: "),t("RouterLink",{attrs:{to:"/json-schema.html#prefixitems"}},[e._v("prefixItems")]),e._v(" keyword and changed semantics of "),t("RouterLink",{attrs:{to:"/json-schema.html#items-in-draft-2020-12"}},[e._v("items")]),e._v(" keyword, "),t("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[e._v("dynamic recursive references")]),e._v(".")],1),e._v(" "),t("li",[e._v("JSON Schema draft-2019-09 features: "),t("RouterLink",{attrs:{to:"/json-schema.html#unevaluatedproperties"}},[t("code",[e._v("unevaluatedProperties")])]),e._v(" and "),t("RouterLink",{attrs:{to:"/json-schema.html#unevaluateditems"}},[t("code",[e._v("unevaluatedItems")])]),e._v(", "),t("RouterLink",{attrs:{to:"/guide/combining-schemas.html#extending-recursive-schemas"}},[e._v("dynamic recursive references")]),e._v(" and other "),t("RouterLink",{attrs:{to:"/json-schema.html#json-schema-draft-2019-09"}},[e._v("additional keywords")]),e._v(".")],1),e._v(" "),t("li",[e._v("OpenAPI "),t("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[e._v("discriminator")]),e._v(" keyword.")],1)])]),e._v(" "),t("li",[e._v("Compiled parsers (as fast as JSON.parse on valid JSON, but replace validation and fail much faster on invalid JSON) and serializers (10x+ faster than JSON.stringify) from JSON Type Definition schemas - see examples in "),t("RouterLink",{attrs:{to:"/guide/getting-started.html#parsing-and-serializing-json"}},[e._v("javascript")]),e._v(" and "),t("RouterLink",{attrs:{to:"/guide/typescript.html#type-safe-parsers-and-serializers"}},[e._v("typescript")]),e._v(".")],1),e._v(" "),t("li",[e._v("comprehensive support for "),t("RouterLink",{attrs:{to:"/standalone.html"}},[e._v("standalone validation code")]),e._v(" - compiling one or multiple schemas to standalone modules with one or multiple exports.")],1),e._v(" "),t("li",[e._v("to reduce the mistakes in JSON schemas and unexpected validation results, "),t("RouterLink",{attrs:{to:"/strict-mode.html"}},[e._v("strict mode")]),e._v(" is added - it prohibits ignored or ambiguous JSON Schema elements. See "),t("RouterLink",{attrs:{to:"/strict-mode.html"}},[e._v("Strict mode")]),e._v(" and "),t("RouterLink",{attrs:{to:"/options.html"}},[e._v("Options")]),e._v(" for more details.")],1),e._v(" "),t("li",[e._v("to make code injection from untrusted schemas impossible, "),t("RouterLink",{attrs:{to:"/codegen.html"}},[e._v("code generation")]),e._v(" is fully re-written to be type-level safe against code injection.")],1),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.")]),e._v(" "),t("li",[e._v("schemas are compiled to ES6 code (ES5 code generation is supported with an option).")]),e._v(" "),t("li",[e._v("to improve reliability and maintainability the code is migrated to TypeScript.")]),e._v(" "),t("li",[e._v("separate Ajv classes from draft-07, draft-2019-09, draft-2020-12 and JSON Type Definition support with different default imports (see "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(".")],1)]),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 version 6 that will be supported until 06/30/2021).')]),e._v(" "),t("li",[e._v("all formats are separated to "),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 - they have to be explicitly added if you use them.")]),e._v(" "),t("li",[e._v("Ajv instance can only be created with "),t("code",[e._v("new")]),e._v(" keyword, as Ajv is now ES6 class.")]),e._v(" "),t("li",[e._v("browser bundles are automatically published to ajv-dist package (but still available on cdnjs.com).")]),e._v(" "),t("li",[e._v("order of schema keyword validation changed - keywords that apply to all types (allOf etc.) are now validated first, before the keywords that apply to specific data types. You can still define custom keywords that apply to all types AND are validated after type-specific keywords using option "),t("code",[e._v("post: true")]),e._v(" in keyword definition.")]),e._v(" "),t("li",[e._v('regular expressions in keywords "pattern" and "patternProperties" are now used as if they had unicode "u" flag, as required by JSON Schema specification - it means that some regular expressions that were valid with Ajv v6 are now invalid (and vice versa).')]),e._v(" "),t("li",[e._v("JSON Schema validation errors changes:\n"),t("ul",[t("li",[t("code",[e._v("dataPath")]),e._v(" property replaced with "),t("code",[e._v("instancePath")])]),e._v(" "),t("li",[e._v('"should" replaced with "must" in the messages')]),e._v(" "),t("li",[e._v('property name is removed from "propertyName" keyword error message (it is still available in '),t("code",[e._v("error.params.propertyName")]),e._v(").")])])])]),e._v(" "),t("h2",{attrs:{id:"better-typescript-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#better-typescript-support"}},[e._v("#")]),e._v(" Better TypeScript support")]),e._v(" "),t("ul",[t("li",[e._v("Methods "),t("code",[e._v("compile")]),e._v(" and "),t("code",[e._v("compileAsync")]),e._v(" now return type-guards - see "),t("RouterLink",{attrs:{to:"/guide/getting-started.html"}},[e._v("Getting started")]),e._v(".")],1),e._v(" "),t("li",[e._v("Method "),t("code",[e._v("validate")]),e._v(" is a type-guard.")]),e._v(" "),t("li",[e._v("Better separation of asynchronous schemas on type level.")]),e._v(" "),t("li",[e._v("Schema utility types to simplify writing schemas:\n"),t("ul",[t("li",[e._v("JSONSchemaType: generates the type for JSON Schema for type interface in the type parameter.")]),e._v(" "),t("li",[e._v("JTDSchemaType: generates the type for JSON Type Definition schema for type interface in the type parameter.")]),e._v(" "),t("li",[e._v("JTDDataType: generates the type for data given JSON Type Definition schema type in the type parameter.")])])])]),e._v(" "),t("h2",{attrs:{id:"potential-migration-difficulties"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#potential-migration-difficulties"}},[e._v("#")]),e._v(" Potential migration difficulties")]),e._v(" "),t("ul",[t("li",[e._v("Schema compilation is now safer against code injections but slower than in v6 ("),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/1386",target:"_blank",rel:"noopener noreferrer"}},[e._v("#1386"),t("OutboundLink")],1),e._v(") - consider using "),t("RouterLink",{attrs:{to:"/standalone.html"}},[e._v("standalone validation code")]),e._v(" if this is a problem. Validation performance in v8 is the same (or better, thanks to "),t("RouterLink",{attrs:{to:"/codegen.html#code-optimization"}},[e._v("code optimizations")]),e._v(").")],1),e._v(" "),t("li",[e._v("Schema object used as a key for compiled schema function, not serialized string ("),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/1413",target:"_blank",rel:"noopener noreferrer"}},[e._v("#1413"),t("OutboundLink")],1),e._v(") can cause schema compilation on each validation if you pass a new schema object. See "),t("RouterLink",{attrs:{to:"/guide/managing-schemas.html"}},[e._v("Managing schemas")]),e._v(" for different approaches to manage caching of compiled validation functions.")],1),e._v(" "),t("li",[e._v("User defined formats with standalone validation code ("),t("a",{attrs:{href:"https://github.com/ajv-validator/ajv/issues/1470",target:"_blank",rel:"noopener noreferrer"}},[e._v("#1470"),t("OutboundLink")],1),e._v(") require passing code snippet to "),t("RouterLink",{attrs:{to:"/options.html#code"}},[e._v("code.formats")]),e._v(" option.")],1)]),e._v(" "),t("h2",{attrs:{id:"api-changes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-changes"}},[e._v("#")]),e._v(" API changes")]),e._v(" "),t("ul",[t("li",[e._v("addVocabulary - NEW method that allows to add an array of keyword definitions.")]),e._v(" "),t("li",[e._v('addKeyword - keyword name should be passed as property in definition object, not as the first parameter (old API works with "deprecated" warning). Also "inline" keywords support is removed, code generation keywords can now be defined with "code" keyword - the same definition format that is used by all pre-defined keywords.')]),e._v(" "),t("li",[e._v("Ajv no longer allows to create the instance without "),t("code",[e._v("new")]),e._v(" keyword (it is ES6 class).")]),e._v(" "),t("li",[e._v("allow "),t("code",[e._v('":"')]),e._v(" in keyword names.")])]),e._v(" "),t("h3",{attrs:{id:"added-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#added-options"}},[e._v("#")]),e._v(" Added options")]),e._v(" "),t("ul",[t("li",[e._v('strict: true/false/"log" - enables/disables all strict mode restrictions:\n'),t("ul",[t("li",[e._v("strictSchema: "),t("strong",[e._v("true")]),e._v('/false/"log" - equivalent to the combination of strictKeywords and strictDefaults in v6, with additional restrictions (see '),t("RouterLink",{attrs:{to:"/strict-mode.html"}},[e._v("Strict mode")]),e._v(").")],1),e._v(" "),t("li",[e._v("strictTypes: true/false/"),t("strong",[e._v('"log"')]),e._v(" - prevent mistakes related to type keywords and keyword applicability (see "),t("RouterLink",{attrs:{to:"/strict-mode.html#strict-types"}},[e._v("Strict Types")]),e._v(").")],1),e._v(" "),t("li",[e._v("strictTuples: true/false/"),t("strong",[e._v('"log"')]),e._v(" - prevent incomplete tuple schemas (see "),t("RouterLink",{attrs:{to:"/strict-mode.html#prohibit-unconstrained-tuples"}},[e._v("Prohibit unconstrained tuples")]),e._v(")")],1),e._v(" "),t("li",[e._v("strictRequired: true/"),t("strong",[e._v("false")]),e._v('/"log" - to log or fail if properties used in JSON Schema "required" are not defined in "properties" (see '),t("RouterLink",{attrs:{to:"/strict-mode.html#defined-required-properties"}},[e._v("Defined required properties")]),e._v(").")],1)])]),e._v(" "),t("li",[e._v('allowUnionTypes: false - allow multiple non-null types in "type" keyword')]),e._v(" "),t("li",[e._v('allowMatchingProperties: false - allow overlap between "properties" and "patternProperties" keywords')]),e._v(" "),t("li",[e._v("discriminator: true - support OpenAPI "),t("RouterLink",{attrs:{to:"/json-schema.html#discriminator"}},[e._v("discriminator")]),e._v(" keyword")],1),e._v(" "),t("li",[e._v("loopEnum - optimise validation of enums, similar to "),t("RouterLink",{attrs:{to:"/options.html#looprequired"}},[e._v("loopRequired")]),e._v(" option.")],1),e._v(" "),t("li",[e._v("validateFormats - enable format validation ("),t("code",[e._v("true")]),e._v(" by default)")]),e._v(" "),t("li",[e._v("code: {optimize: number|boolean} - control "),t("RouterLink",{attrs:{to:"/codegen.html#code-optimization"}},[e._v("code optimisation")])],1),e._v(" "),t("li",[e._v("code: {es5: true} - generate ES5 code, the default is to generate ES6 code.")]),e._v(" "),t("li",[e._v("code: {lines: true} - add line breaks to generated code - simplifies debugging of compiled schemas when you need it")])]),e._v(" "),t("h3",{attrs:{id:"changed-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#changed-options"}},[e._v("#")]),e._v(" Changed options")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("keywords")]),e._v(' - now expects the array of keyword definitions (old API works with "deprecated" warning).')]),e._v(" "),t("li",[t("code",[e._v("strictNumbers")]),e._v(" - true by default now.")])]),e._v(" "),t("h3",{attrs:{id:"removed-options"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#removed-options"}},[e._v("#")]),e._v(" Removed options")]),e._v(" "),t("ul",[t("li",[e._v("errorDataPath - was deprecated, now removed.")]),e._v(" "),t("li",[e._v("format - "),t("code",[e._v("validateFormats: false")]),e._v(" can be used instead, format mode can be chosen via ajv-formats package.")]),e._v(" "),t("li",[e._v("nullable: "),t("code",[e._v("nullable")]),e._v(" keyword is supported by default.")]),e._v(" "),t("li",[e._v("jsonPointers: JSONPointers are used to report errors by default, "),t("code",[e._v("jsPropertySyntax: true")]),e._v(" (deprecated) can be used if old format is needed.")]),e._v(" "),t("li",[e._v("unicode: deprecated, string length correctly accounts for multi-byte characters by default.")]),e._v(" "),t("li",[e._v("extendRefs: $ref siblings are validated by default (consistent with draft 2019-09), "),t("code",[e._v("ignoreKeywordsWithRef")]),e._v(" (deprecated) can be used instead to ignore $ref siblings.")]),e._v(" "),t("li",[e._v("missingRefs: now exception is always thrown. Pass empty schema with $id that should be ignored to ajv.addSchema.")]),e._v(" "),t("li",[e._v("processCode: replaced with "),t("code",[e._v("code: {process: (code, schemaEnv: object) => string}")]),e._v(".")]),e._v(" "),t("li",[e._v("sourceCode: replaced with "),t("code",[e._v("code: {source: true}")]),e._v(".")]),e._v(" "),t("li",[e._v("schemaId: removed, as JSON Schema draft-04 is no longer supported.")]),e._v(" "),t("li",[e._v("strictDefaults, strictKeywords: it is default now, controlled with "),t("code",[e._v("strict")]),e._v(" or "),t("code",[e._v("strictSchema")]),e._v(".")]),e._v(" "),t("li",[e._v('uniqueItems: \'"uniqueItems" keyword is always validated.')]),e._v(" "),t("li",[e._v("unknownFormats: the same can be achieved by passing true for formats that need to be ignored via "),t("code",[e._v("ajv.addFormat")]),e._v(" or "),t("code",[e._v("formats")]),e._v(" option.")]),e._v(" "),t("li",[e._v("cache and serialize: Map is used as cache, schema object as key.")])])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/app.cce4d25b.js b/assets/js/app.cce4d25b.js new file mode 100644 index 000000000..d57872e75 --- /dev/null +++ b/assets/js/app.cce4d25b.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],c=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),c=l.querySelector(r.barSelector),u=r.speed,f=r.easing;return l.offsetWidth,a((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,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,u,f)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),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");c(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),u=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),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(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 c(e,t){var n=f(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function u(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),c=n(118);e.exports=function(e,t){var n,u,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(u in t){if(p=t[u],f=e.dontCallGetSet?(d=o(n,u))&&d.value:n[u],!c(h?u:v+(m?".":"#")+u,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,u,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),c=r.Symbol,u=o("wks"),f=l?c.for||c:c&&c.withoutSetter||a;e.exports=function(e){return i(u,e)||(u[e]=s&&i(c,e)?c[e]:f("Symbol."+e)),u[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),c=n(8),u=n(58),f=Object.getOwnPropertyDescriptor;t.f=r?f:function(e,t){if(e=s(e),t=l(t),u)try{return f(e,t)}catch(e){}if(c(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,c=s&&s.versions||l&&l.version,u=c&&c.v8;u&&(o=(r=u.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,c=i.f,u=0;uu))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),c=TypeError,u=l("toPrimitive");e.exports=function(e,t){if(!o(e)||i(e))return e;var n,l=a(e,u);if(l){if(void 0===t&&(t="default"),n=r(l,e,t),!o(n)||i(n))return n;throw new c("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,c=s&&(!r||r&&a(i,"name").configurable);e.exports={EXISTS:s,PROPER:l,CONFIGURABLE:c}},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),c=n(12),u=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(u(e,g))throw new v("Object already initialized");return t.facade=e,c(e,g,t),t},o=function(e){return u(e,g)?e[g]:{}},i=function(e){return u(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),c=0,u=[];for(n in r)!o(s,n)&&o(r,n)&&l(u,n);for(;t.length>c;)o(r,n=t[c++])&&(~a(u,n)||l(u,n));return u}},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 c,u=o(a,l);if(e&&n!=n){for(;l>u;)if((c=s[u++])!=c)return!0}else for(;l>u;u++)if((e||u in s)&&s[u]===n)return e||u||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===u||n!==c&&(o(t)?r(t):!!t)},s=a.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=a.data={},c=a.NATIVE="N",u=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",c=function(e){return function(t,n,c,u){var f=o(t),p=i(f),d=a(f);if(r(n),0===d&&c<2)throw new s(l);var v=e?d-1:0,h=e?-1:1;if(c<2)for(;;){if(v in p){u=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&&(u=n(u,p[v],v,f));return u}};e.exports={left:c(!1),right:c(!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,c=function(e,t){var n={};n[e]=a(e,t,l),r({global:!0,constructor:!0,arity:1,forced:l},n)},u=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)}};c("Error",(function(e){return function(t){return i(e,this,arguments)}})),c("EvalError",(function(e){return function(t){return i(e,this,arguments)}})),c("RangeError",(function(e){return function(t){return i(e,this,arguments)}})),c("ReferenceError",(function(e){return function(t){return i(e,this,arguments)}})),c("SyntaxError",(function(e){return function(t){return i(e,this,arguments)}})),c("TypeError",(function(e){return function(t){return i(e,this,arguments)}})),c("URIError",(function(e){return function(t){return i(e,this,arguments)}})),u("CompileError",(function(e){return function(t){return i(e,this,arguments)}})),u("LinkError",(function(e){return function(t){return i(e,this,arguments)}})),u("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),c=n(128),u=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)&&u(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 _&&(c(j,_,"stackTraceLimit"),c(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,c=t.length;for(i||(i=o),s||(s=[]);++l0&&i(u)?n>1?e(u,n-1,i,a,s):r(s,u):a||(s[s.length]=u)}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 c=n[a];if(l&&c[2]?c[1]!==e[c[0]]:!(c[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,c=Object.prototype,u=l.toString,f=c.hasOwnProperty,p=RegExp("^"+u.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 c=-1,u=o,f=e.length,p=!0,d=[],v=d;if(n)p=!1,u=i;else if(f>=200){var h=t?null:s(e);if(h)return l(h);p=!1,u=a,v=new r}else v=t?[]:d;e:for(;++c-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 ce,ue="undefined"!=typeof Symbol&&le(Symbol)&&"undefined"!=typeof Reflect&&le(Reflect.ownKeys);ce="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((c=e(c,"".concat(n||"","_").concat(r)))[0])&&Ze(f)&&(p[u]=he(f.text+c[0].text),c.shift()),p.push.apply(p,c)):l(c)?Ze(f)?p[u]=he(f.text+c):""!==c&&p.push(he(c)):Ze(c)&&Ze(f)?p[u]=he(f.text+c.text):(s(t._isVList)&&a(c.tag)&&i(c.key)&&a(n)&&(c.key="__vlist".concat(n,"_").concat(r,"__")),p.push(c)));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 c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=mt(e,n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=gt(n,u));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||ue&&"Module"===e[Symbol.toStringTag])&&(e=e.default),u(e)?t.extend(e):e}function kt(e){if(o(e))for(var t=0;tdocument.createEvent("Event").timeStamp&&(cn=function(){return un.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=cn(),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=ue?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=c(t)?t.call(e):t;if(!u(n))return;for(var r=Be(e),o=ue?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),c(e.install)?e.install.apply(e,n):c(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&&c(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):""},cr=function(e){return null==e||!1===e};function ur(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)?cr(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 cr(t)||"false"===t?"false":"contenteditable"===e&&or(t)?t:"true"}(t,n)):sr(t)?cr(n)?e.removeAttributeNS(ar,lr(t)):e.setAttributeNS(ar,t,n):Ir(e,t,n)}function Ir(e,t,n){if(cr(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=ur(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||{},c=t.data.domProps||{};for(n in(a(c.__ob__)||s(c._v_attr_proxy))&&(c=t.data.domProps=T({},c)),l)n in c||(o[n]="");for(n in c){if(r=c[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 u=i(r)?"":String(r);Zr(o,u)&&(o.value=u)}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(co).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(co).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),uo(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,c=function(){e.removeEventListener(s,u),n()},u=function(t){t.target===e&&++l>=a&&c()};setTimeout((function(){l0&&(n="transition",u=a,f=i.length):"animation"===t?c>0&&(n="animation",u=c,f=l.length):f=(n=(u=Math.max(a,c))>0?a>c?"transition":"animation":null)?"transition"===n?i.length:l.length:0,{type:n,timeout:u,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={},c=e.modules,u=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,c):a(g)?(a(e.text)&&u.setTextContent(f,""),_(f,null,g,0,g.length-1,n)):a(h)?x(h,0,h.length-1):a(e.text)&&u.setTextContent(f,""):e.text!==t.text&&u.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),c=this._vnode,u=Ho(c);if(i.data.directives&&i.data.directives.some(Zo)&&(i.data.show=!0),u&&u.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(i,u)&&!vt(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var f=u.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 c;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||""),c=t&&t.path||"/",u=l.path?ji(l.path,c,n||o.append):c,f=function(e,t,n){void 0===t&&(t={});var r,o=n||ui;try{r=o(e||"")}catch(e){r={}}for(var i in t){var a=t[i];r[i]=Array.isArray(a)?a.map(ci):ci(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:u,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={},c=n.options.linkActiveClass,u=n.options.linkExactActiveClass,f=null==c?"router-link-active":c,p=null==u?"router-link-exact-active":u,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(u.path,s.params),l(u,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,c=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()})),u=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(c,u)}catch(e){u(e)}if(l)if("function"==typeof l.then)l.then(c,u);else{var f=l.component;f&&"function"==typeof f.then&&f.then(c,u)}}})),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,c=o.matched.length-1;if(yi(e,o)&&l===c&&e.matched[l]===o.matched[c])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 u=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-094b9dee":()=>n.e(45).then(n.bind(null,392)),"v-0b4d4089":()=>n.e(44).then(n.bind(null,393)),"v-7eb94829":()=>n.e(46).then(n.bind(null,394)),"v-29ebca8e":()=>n.e(47).then(n.bind(null,395)),"v-51aaf849":()=>n.e(48).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-83a41dee":()=>n.e(52).then(n.bind(null,400)),"v-464fd629":()=>n.e(55).then(n.bind(null,401)),"v-49301ee2":()=>n.e(53).then(n.bind(null,402)),"v-d1f646ae":()=>n.e(54).then(n.bind(null,403)),"v-7cca31fe":()=>n.e(56).then(n.bind(null,404)),"v-b5351e9e":()=>n.e(57).then(n.bind(null,405)),"v-76cafeae":()=>n.e(58).then(n.bind(null,406)),"v-62aa1369":()=>n.e(60).then(n.bind(null,407)),"v-5e92fa09":()=>n.e(62).then(n.bind(null,408)),"v-f3391bf6":()=>n.e(59).then(n.bind(null,409)),"v-3ad539ae":()=>n.e(61).then(n.bind(null,410)),"v-48953121":()=>n.e(64).then(n.bind(null,411)),"v-8de1af1a":()=>n.e(63).then(n.bind(null,412)),"v-1f38ca2e":()=>n.e(65).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-959a2c2e":()=>n.e(72).then(n.bind(null,420)),"v-506a67bc":()=>n.e(73).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-7f55ccc9":()=>n.e(79).then(n.bind(null,427)),"v-bf7e876e":()=>n.e(80).then(n.bind(null,428)),"v-20f55eeb":()=>n.e(82).then(n.bind(null,429)),"v-bb53a316":()=>n.e(81).then(n.bind(null,430)),"v-90fdf4e6":()=>n.e(84).then(n.bind(null,431)),"v-114a7465":()=>n.e(85).then(n.bind(null,432)),"v-74774829":()=>n.e(83).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 cs(e){return ts(rs,e)}function us(e){return ts(as,e)}function fs(...e){return Promise.all(e.filter(e=>e).map(async e=>{if(!us(e)&&cs(e)){const t=await cs(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-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-0b4d4089",path:"/api.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-0b4d4089").then(n)}},{name:"v-7eb94829",path:"/codegen.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7eb94829").then(n)}},{name:"v-29ebca8e",path:"/coercion.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-29ebca8e").then(n)}},{name:"v-51aaf849",path:"/components.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-51aaf849").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-83a41dee",path:"/guide/combining-schemas.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-83a41dee").then(n)}},{name:"v-464fd629",path:"/guide/getting-started.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-464fd629").then(n)}},{name:"v-49301ee2",path:"/guide/environments.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-49301ee2").then(n)}},{name:"v-d1f646ae",path:"/guide/formats.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-d1f646ae").then(n)}},{name:"v-7cca31fe",path:"/guide/managing-schemas.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7cca31fe").then(n)}},{name:"v-b5351e9e",path:"/guide/modifying-data.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-b5351e9e").then(n)}},{name:"v-76cafeae",path:"/guide/schema-language.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-76cafeae").then(n)}},{name:"v-62aa1369",path:"/guide/user-keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-62aa1369").then(n)}},{name:"v-5e92fa09",path:"/json-schema.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-5e92fa09").then(n)}},{name:"v-f3391bf6",path:"/guide/typescript.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-f3391bf6").then(n)}},{name:"v-3ad539ae",path:"/guide/why-ajv.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-3ad539ae").then(n)}},{name:"v-48953121",path:"/keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-48953121").then(n)}},{name:"v-8de1af1a",path:"/json-type-definition.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-8de1af1a").then(n)}},{name:"v-1f38ca2e",path:"/license.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-1f38ca2e").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-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-506a67bc",path:"/news/",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-506a67bc").then(n)}},{path:"/news/index.html",redirect:"/news/"},{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-7f55ccc9",path:"/packages/ajv-i18n.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-7f55ccc9").then(n)}},{name:"v-bf7e876e",path:"/packages/ajv-keywords.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-bf7e876e").then(n)}},{name:"v-20f55eeb",path:"/standalone.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-20f55eeb").then(n)}},{name:"v-bb53a316",path:"/security.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-bb53a316").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)}},{name:"v-74774829",path:"/strict-mode.html",component:Cs,beforeEnter:(e,t,n)=>{fs("Layout","v-74774829").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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"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:"User-defined keywords",frontmatter:{},regularPath:"/guide/user-keywords.html",relativePath:"guide/user-keywords.md",key:"v-62aa1369",path:"/guide/user-keywords.html"},{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:"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:"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:"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"}]},{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"}]},{frontmatter:{},regularPath:"/license.html",relativePath:"license.md",key:"v-1f38ca2e",path:"/license.html"},{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:"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 News",frontmatter:{newsIndex:!0,editLink:!1},regularPath:"/news/",relativePath:"news/README.md",key:"v-506a67bc",path:"/news/"},{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-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"}]},{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:"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:"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"}]},{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"}]},{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"}]}],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:cs,getVueComponent:us});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 a59b2c7eb..ddcae6fe0 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 ec7a3350a..cf5a61482 100644 --- a/codegen.html +++ b/codegen.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/coercion.html b/coercion.html index b3f308bee..253ed7111 100644 --- a/coercion.html +++ b/coercion.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/components.html b/components.html index 5fcaf39bd..6b38de1e7 100644 --- a/components.html +++ b/components.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/contributing/index.html b/contributing/index.html index 84bf9a92e..004ec1473 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/faq.html b/faq.html index 788b59ba3..e3f46ac40 100644 --- a/faq.html +++ b/faq.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/async-validation.html b/guide/async-validation.html index 74fa88b2f..55512664c 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 4b99ee1a8..63181844e 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 1f7a9732f..8615a7fcf 100644 --- a/guide/environments.html +++ b/guide/environments.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/guide/formats.html b/guide/formats.html index bd1e345fc..461d5aefb 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 331a377e3..611c662ee 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 f460b0d7e..723bbebf5 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 906b4f23c..7a9cfd59a 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 c783bf68a..d85043bc6 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 5dc1d2a81..f1d8ea97f 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 0c6fc092c..a97b4708e 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 53f9a71f8..e0ac9adb0 100644 --- a/guide/why-ajv.html +++ b/guide/why-ajv.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/json-schema.html b/json-schema.html index 2e68a902c..e313c5c32 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 c5d44dd80..a622a7bd2 100644 --- a/json-type-definition.html +++ b/json-type-definition.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/keywords.html b/keywords.html index e97902115..01427c7f0 100644 --- a/keywords.html +++ b/keywords.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/license.html b/license.html index 350f5dead..9a8071f29 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 1f09963f2..d1d3eeb6c 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 335bcf007..cda15f68a 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 c7e4a8751..adb62ee22 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 a11b03995..724169cad 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 988be546a..0fc208b13 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 6494b07b4..32fc4868d 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 ba68087b5..ac3d04309 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 c315050b3..bd3aa82c6 100644 --- a/news/index.html +++ b/news/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/options.html b/options.html index 3fb405e93..335d14cd5 100644 --- a/options.html +++ b/options.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/packages/ajv-cli.html b/packages/ajv-cli.html index 5fc4dbaa0..cab86b410 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 311c7931e..4b5116208 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 bb70c9d2d..b66810fe5 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 26b684586..b4b77610f 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 f692c21a5..26218e3b3 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 eeae061c9..6f833aa0f 100644 --- a/packages/index.html +++ b/packages/index.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/security.html b/security.html index 08e9ab9d6..17242553e 100644 --- a/security.html +++ b/security.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/standalone.html b/standalone.html index 5952acc7d..1525bc304 100644 --- a/standalone.html +++ b/standalone.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/strict-mode.html b/strict-mode.html index 656ba7524..e216eb4fb 100644 --- a/strict-mode.html +++ b/strict-mode.html @@ -18,8 +18,8 @@ - - + +
- + diff --git a/testimonials.html b/testimonials.html index d04437380..1ecf35090 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 11382cb14..d382f6b17 100644 --- a/v6-to-v8-migration.html +++ b/v6-to-v8-migration.html @@ -18,8 +18,8 @@ - - + +