조국현

Release Version number 1.1(Merge branch 'release/version_1.0')

Showing 1000 changed files with 4820 additions and 68 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

1 +/.vscode
2 +/node_modules
3 +/sessions
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@500&display=swap');
1 *{ 2 *{
2 padding:0; 3 padding:0;
3 margin:0; 4 margin:0;
4 - box-sizing:border-box; 5 + box-sizing:border-box;
6 +}
7 +body{
8 + height: 100vh;
9 + background-image: url('https://images.unsplash.com/photo-1533035353720-f1c6a75cd8ab?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80');
10 + background-position: center;
11 + background-repeat: repeat;
12 + background-size: cover;
13 + background-attachment: scroll;
14 +}
15 +flex-containter{
16 + font-size:100px;
17 + font-family: 'Noto Sans KR', sans-serif;
18 +}
19 +form input{
20 + width:60%;
21 + padding:7px;
22 + background-color:white;
23 + border-radius:30px;
5 } 24 }
6 .containter{ 25 .containter{
7 - width:90%; 26 + position:relative;
27 + width:80%;
8 height:auto; 28 height:auto;
9 - max-width:1200px; 29 + max-width:3200px;
10 - margin:0 auto; 30 + margin:0;/*auto*/
31 + color:black;
32 + font-size:100px;
33 + font-family: 'Noto Sans KR', sans-serif;
11 } 34 }
12 form{ 35 form{
13 - width:50%; 36 + width:90%;
14 - max-width:400px;
15 border-radius:4px; 37 border-radius:4px;
38 + margin-top:-10px;
39 + margin-left:10px;
40 +/* background-color:white;
41 + */}
42 +form{
43 + display:inline-block;
16 } 44 }
17 -form input{ 45 +.search-result{
18 - width:100%; 46 + /*여러줄로 보여주기 위해선 grid 사용해야하는데, 우선은 영상목록 뽑아보고 결정*/
47 + /*grid로 바꿔놓음. 여러 열로 사진들이 정렬됨*/
48 + display:grid;
49 + row-gap:15%;
50 + grid-template-columns: repeat(auto-fill, minmax(25%, auto));
51 +/* grid-template:auto/repeat(auto-fill,minmax(250px,1fr)); */
52 + margin-top:50px;
53 + width:200%;
54 + margin-left:265px;
55 + margin-bottom:100px;
56 +}
57 +/*form input{
58 + width:80%;
59 + padding:10px;
60 + border:none;
61 + outline:none;
62 + font-size:1.8rem;
63 + display:inline-block;
19 } 64 }
20 -form ion-icon{ 65 +*/ form ion-icon{
21 width:9%; 66 width:9%;
22 font-size:3rem; 67 font-size:3rem;
23 - margin:-15px; 68 + margin-left:10px;
69 + margin-top:15px;
24 color:rgb(75,75,75); 70 color:rgb(75,75,75);
25 - 71 +}
72 +.search-box{
73 + margin-left:-10px;
74 + margin-top:10px;
75 +}
76 +img{
77 + width:80%;
78 + height:80%;
79 + object-fit:cover;
80 +}
81 +html{
82 + font-size:15px;
83 + font-family: 'Nanum Pen Script', cursive;
84 +}
85 +section{
86 + min-height:100vh;
87 + width:100%;
88 + display:flex;
89 + padding:100px 0;
90 + align-items:stretch;
91 +}
92 +.brand{
93 + margin-top:-70px;
94 + font-size:4rem;
95 + color:black;
96 + margin-bottom:30px;
26 } 97 }
...\ No newline at end of file ...\ No newline at end of file
......
1 - 1 +<!DOCTYPE html>
2 - <!DOCTYPE html> 2 +<html lang="en">
3 - <html lang="en"> 3 +<head>
4 - <head> 4 + <meta charset="UTF-8">
5 - <meta charset="UTF-8"> 5 + <script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
6 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 +
7 - <title>Document</title> 7 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 - <link rel="style sheet" href="main.css"> 8 + <title>Document</title>
9 - </head> 9 + <link rel="stylesheet" href="main.css">
10 - <body> 10 +</head>
11 - <section> 11 +<body>
12 - <div class="container"> 12 + <section>
13 - <h1 class="brand">Recipe APP</h1> 13 + <div class="container">
14 - <div class="serach-box"> 14 + <h1 class="brand">Recipe APP</h1>
15 - <form> 15 + <form>
16 - <input id="name" type="text" placeholder="Search Your Recipe..."> 16 + <input id="name" type="text" placeholder="Search Your Recipe..ex) pizza">
17 - <ion-icon name="search"></ion-icon> 17 + <ion-icon name="search"></ion-icon>
18 - </form> 18 + </form>
19 + <p>
20 + <input type='checkbox'
21 + name='chkbox[]'
22 + value=800
23 + onclick='getCheckboxValue(event)'/> 800
24 + <input type='checkbox'
25 + name='chkbox[]'
26 + value=1200
27 + onclick='getCheckboxValue(event)'/> 1200
28 + <input type='checkbox'
29 + name='chkbox[]'
30 + value=1600
31 + onclick='getCheckboxValue(event)'/> 1600
32 + <input type='checkbox'
33 + name='chkbox[]'
34 + value=2000
35 + onclick='getCheckboxValue(event)'/> 2000
36 + </p>
37 +<!-- <select id="selectBox">
38 + <option value="800" >800</option>
39 + <option value="1200">1200</option>
40 + <option value="1600" >1600</option>
41 + </select> -->
42 + <div class="search-result">
43 + <!--<div class="item">
44 + <img src="./0.jpg" alt="">
45 + <div class="flex-container">
46 + <h1 class="title">This is a recipe</h1>
47 + <a href="#">View Recipe</a>
19 </div> 48 </div>
20 - <div class="search-result"> 49 + <p class="item-data">Calories: 120</p>
21 - <!--<div class="item"> 50 + </div>-->
22 - <img src="./0.jpg" alt=""> 51 + </div>
23 - <div class="flex-container"> 52 + </div>
24 - <h1 class="title">This is a recipe</h1> 53 + </section>
25 - <a href="#">View Recipe</a> 54 + <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
26 - </div> 55 + <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
27 - <p class="item-data">Calories: 120</p> 56 + <script src="./main.js"></script>
28 - </div>--> 57 +</body>
29 - </div> 58 +</html>
30 - </div>
31 - </section>
32 - <script src="./main.js"></script>
33 - <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
34 - <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
35 - </body>
36 - </html>
...\ No newline at end of file ...\ No newline at end of file
......
1 +/* version 1.1 bumped*/
2 +Kakao.init('fill yours');
3 +const APP_ID = 'fill yours';
4 +const APP_KEY = 'fill yours';
5 +var caloriesLimit=9999;
6 +var checkCount=0;
7 +var checkLimit=2;
8 +chk=document.getElementsByName("chkbox[]");
9 +function getCheckboxValue(event) {
10 + if(event.target.checked) {
11 + caloriesLimit = event.target.value;
12 + checkCount+=1;
13 + }else {
14 + caloriesLimit=9999;
15 + checkCount-=1;
16 + }
17 + if(checkCount>=checkLimit)
18 + {
19 + alert("칼로리 체크박스는 하나만 선택 가능합니다.");
20 + checkInitialize();
21 + checkCount=0;
22 + }
23 +}
24 +function checkInitialize(){
25 +
26 + for(i=0;i<chk.length;i++){
27 + chk[i].checked=false;
28 + caloriesLimit=9999;
29 +
30 + }
31 +
32 +}
1 const searchForm = document.querySelector('form'); 33 const searchForm = document.querySelector('form');
2 const searchResultDiv = document.querySelector('.search-result') 34 const searchResultDiv = document.querySelector('.search-result')
3 -const APP_ID = '0a67fbc1';
4 -const APP_KEY = '225d31b59bf211d7ede34e2e885f1f3b';
5 searchForm.addEventListener('submit', function(event){ 35 searchForm.addEventListener('submit', function(event){
6 if(document.getElementById('name').value.length === 0){ 36 if(document.getElementById('name').value.length === 0){
7 alert('한글자 이상 입력해주세요'); 37 alert('한글자 이상 입력해주세요');
...@@ -12,11 +42,37 @@ searchForm.addEventListener('submit', function(event){ ...@@ -12,11 +42,37 @@ searchForm.addEventListener('submit', function(event){
12 event.preventDefault(); 42 event.preventDefault();
13 } 43 }
14 else{ 44 else{
15 - event.preventDefault(); 45 + event.preventDefault();
16 searchQuery = event.target.querySelector('input').value; 46 searchQuery = event.target.querySelector('input').value;
17 fetchAPI(); 47 fetchAPI();
18 } 48 }
19 }); 49 });
50 +function shareRecipe(sns,urlInfo,foodImage,foodLabel) {
51 + var documentUrl = document.URL;
52 + var snsWrite = "친구에게 요리 레시피 추천! 같이 요리 해먹자~"+urlInfo;
53 + if( sns == 'facebook' ) {
54 + var url = "http://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(urlInfo);
55 + window.open(url, "", "width=600, height=4060");
56 + }
57 + else if( sns == 'twitter' ) {
58 + var url = "http://twitter.com/share?url="+encodeURIComponent(documentUrl)+"&text="+encodeURIComponent(snsWrite);
59 + window.open(url, "tweetPop", "width=600, height=400,scrollbars=yes");
60 + }else if(sns=='kakaotalk'){
61 + Kakao.Link.createDefaultButton({
62 + container:'#buttonkakao',
63 + objectType:'feed',
64 + content:{
65 + title:"친구에게 요리 레시피 추천!",
66 + description:foodLabel+" 같이 요리 해먹자~",
67 + imageUrl:foodImage,
68 + link:{
69 + mobileWebUrl:urlInfo,
70 + webUrl:urlInfo
71 + },
72 + },
73 + });
74 + }
75 +}
20 async function fetchAPI(){ 76 async function fetchAPI(){
21 const recipeURL = `https://api.edamam.com/search?q=${searchQuery}&app_id=${APP_ID}&app_key=${APP_KEY}`; 77 const recipeURL = `https://api.edamam.com/search?q=${searchQuery}&app_id=${APP_ID}&app_key=${APP_KEY}`;
22 const response = await fetch(recipeURL); 78 const response = await fetch(recipeURL);
...@@ -27,34 +83,49 @@ async function fetchAPI(){ ...@@ -27,34 +83,49 @@ async function fetchAPI(){
27 function boxinfo(results){ 83 function boxinfo(results){
28 let boxsinfo =''; 84 let boxsinfo ='';
29 results.map(result => { 85 results.map(result => {
86 + const object = {
87 + cal: result.recipe.calories.toFixed(0)
88 + };
89 + if(result.recipe.calories>=caloriesLimit){}
90 + else{
30 boxsinfo += 91 boxsinfo +=
31 ` 92 `
32 <style> 93 <style>
33 - .item{ 94 + @import url(//fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@500&display=swap);
34 - display:flex;
35 - flex-wrap:wrap;
36 - margin-left:50px auto;
37 - }
38 - .container{
39 - display:flex;
40 - flex-wrap:wrap;
41 - margin-left:50px auto;
42 -
43 - }
44 - <!--검색결과사진,레시피정보 모두 검색창 옆으로 가게하는거까지는 되었고 2열씩 정렬하려 했는데 2열 정렬 부분이 미완성. 우선 사진 옆으로 정보만 수평으로 뜸-->
45 - <!--검색결과 뜰 시에 검색창 위치가 바뀌는 문제 있음-->
46 -
47 -
48 </style> 95 </style>
49 <div class="item"> 96 <div class="item">
50 - <img src="${result.recipe.image}" alt=""> 97 + <img src="${result.recipe.image}">
51 - <div class="flex-container"> 98 + <div class="flex-container" style="font-family: 'Noto Sans KR', sans-serif;">
52 <h1 class="title">${result.recipe.label}</h1> 99 <h1 class="title">${result.recipe.label}</h1>
53 <a href="${result.recipe.url}" target="_blank">View Recipe</a> 100 <a href="${result.recipe.url}" target="_blank">View Recipe</a>
101 + <!--result.recipe.labe에 + home + recipe 한 검색결과 페이지를 버튼에 링크시켜놓음-->
102 + <a href="https://www.youtube.com/results?search_query=${result.recipe.label}+home+recipe" target="_blank">View Videos</a>
103 + <ul class="sns">
104 + <li class="facebook">
105 + <a href="#n" onclick="shareRecipe('facebook','${result.recipe.url}');return false;" class="facebook" target="_self" title="페이스북 공유"><span class="skip">페이스북</span></a>
106 + </li>
107 + <li class="twitter">
108 + <a href="" onclick="shareRecipe('twitter','${result.recipe.url}');return false;" class="twitter" target="_self" title="트위터 공유"><span class="skip">트위터</span></a>
109 + </li>
110 + <li class="kakaotalk">
111 + <a href="javascript:shareRecipe('kakaotalk','${result.recipe.url}','${result.recipe.image}','${result.recipe.label}')" id="buttonkakao" onclick="shareRecipe('kakaotalk','${result.recipe.url}','${result.recipe.image}','${result.recipe.label}');return false;" class="kakaotalk" target="_self" title="카카오톡 새창열림"><span class="skip">카카오톡</span></a>
112 + </li>
113 + </ul>
54 </div> 114 </div>
55 - <p class="item-data">Calories: ${result.recipe.calories.toFixed(0)}</p> 115 + ${(cal => {
116 + if (cal >= 2000) {
117 + return `<p style="color:red">${cal}</p>`;
118 + }
119 + else if(cal >= 1000 && cal < 2000){
120 + return `<p style="color:black">${cal}</p>`;
121 + }
122 + else {
123 + return `<p style="color:green">${cal}</p>`;
124 + }
125 + })(object.cal)
126 + }
56 </div> 127 </div>
57 - ` 128 + `}
58 }) 129 })
59 searchResultDiv.innerHTML = boxsinfo; 130 searchResultDiv.innerHTML = boxsinfo;
60 } 131 }
...\ No newline at end of file ...\ No newline at end of file
......
1 +<!doctype html>
2 +<html lang="ko">
3 +<head>
4 +<script type="text/javascript" src="https://static.nid.naver.com/js/naverLogin_implicit-1.0.3.js" charset="utf-8"></script>
5 +<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
6 +</head>
7 +<body>
8 +<script type="text/javascript">
9 + var naver_id_login = new naver_id_login("fill yours", "http://localhost:3000/");
10 + // 접근 토큰 값 출력
11 + alert(naver_id_login.oauthParams.access_token);
12 + // 네이버 사용자 프로필 조회
13 + naver_id_login.get_naver_userprofile("naverSignInCallback()");
14 + // 네이버 사용자 프로필 조회 이후 프로필 정보를 처리할 callback function
15 + function naverSignInCallback() {
16 + alert(naver_id_login.getProfileData('email'));
17 + alert(naver_id_login.getProfileData('nickname'));
18 + alert(naver_id_login.getProfileData('age'));
19 + }
20 + console.log("callback화면 작동확인:");
21 +</script>
22 +</body>
23 +</html>
...\ No newline at end of file ...\ No newline at end of file
1 +#!/bin/sh
2 +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3 +
4 +case `uname` in
5 + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6 +esac
7 +
8 +if [ -x "$basedir/node" ]; then
9 + exec "$basedir/node" "$basedir/../sshpk/bin/sshpk-conv" "$@"
10 +else
11 + exec node "$basedir/../sshpk/bin/sshpk-conv" "$@"
12 +fi
1 +@ECHO off
2 +GOTO start
3 +:find_dp0
4 +SET dp0=%~dp0
5 +EXIT /b
6 +:start
7 +SETLOCAL
8 +CALL :find_dp0
9 +
10 +IF EXIST "%dp0%\node.exe" (
11 + SET "_prog=%dp0%\node.exe"
12 +) ELSE (
13 + SET "_prog=node"
14 + SET PATHEXT=%PATHEXT:;.JS;=;%
15 +)
16 +
17 +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sshpk\bin\sshpk-conv" %*
1 +#!/usr/bin/env pwsh
2 +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3 +
4 +$exe=""
5 +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6 + # Fix case when both the Windows and Linux builds of Node
7 + # are installed in the same directory
8 + $exe=".exe"
9 +}
10 +$ret=0
11 +if (Test-Path "$basedir/node$exe") {
12 + # Support pipeline input
13 + if ($MyInvocation.ExpectingInput) {
14 + $input | & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
15 + } else {
16 + & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
17 + }
18 + $ret=$LASTEXITCODE
19 +} else {
20 + # Support pipeline input
21 + if ($MyInvocation.ExpectingInput) {
22 + $input | & "node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
23 + } else {
24 + & "node$exe" "$basedir/../sshpk/bin/sshpk-conv" $args
25 + }
26 + $ret=$LASTEXITCODE
27 +}
28 +exit $ret
1 +#!/bin/sh
2 +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3 +
4 +case `uname` in
5 + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6 +esac
7 +
8 +if [ -x "$basedir/node" ]; then
9 + exec "$basedir/node" "$basedir/../sshpk/bin/sshpk-sign" "$@"
10 +else
11 + exec node "$basedir/../sshpk/bin/sshpk-sign" "$@"
12 +fi
1 +@ECHO off
2 +GOTO start
3 +:find_dp0
4 +SET dp0=%~dp0
5 +EXIT /b
6 +:start
7 +SETLOCAL
8 +CALL :find_dp0
9 +
10 +IF EXIST "%dp0%\node.exe" (
11 + SET "_prog=%dp0%\node.exe"
12 +) ELSE (
13 + SET "_prog=node"
14 + SET PATHEXT=%PATHEXT:;.JS;=;%
15 +)
16 +
17 +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sshpk\bin\sshpk-sign" %*
1 +#!/usr/bin/env pwsh
2 +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3 +
4 +$exe=""
5 +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6 + # Fix case when both the Windows and Linux builds of Node
7 + # are installed in the same directory
8 + $exe=".exe"
9 +}
10 +$ret=0
11 +if (Test-Path "$basedir/node$exe") {
12 + # Support pipeline input
13 + if ($MyInvocation.ExpectingInput) {
14 + $input | & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
15 + } else {
16 + & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
17 + }
18 + $ret=$LASTEXITCODE
19 +} else {
20 + # Support pipeline input
21 + if ($MyInvocation.ExpectingInput) {
22 + $input | & "node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
23 + } else {
24 + & "node$exe" "$basedir/../sshpk/bin/sshpk-sign" $args
25 + }
26 + $ret=$LASTEXITCODE
27 +}
28 +exit $ret
1 +#!/bin/sh
2 +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3 +
4 +case `uname` in
5 + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6 +esac
7 +
8 +if [ -x "$basedir/node" ]; then
9 + exec "$basedir/node" "$basedir/../sshpk/bin/sshpk-verify" "$@"
10 +else
11 + exec node "$basedir/../sshpk/bin/sshpk-verify" "$@"
12 +fi
1 +@ECHO off
2 +GOTO start
3 +:find_dp0
4 +SET dp0=%~dp0
5 +EXIT /b
6 +:start
7 +SETLOCAL
8 +CALL :find_dp0
9 +
10 +IF EXIST "%dp0%\node.exe" (
11 + SET "_prog=%dp0%\node.exe"
12 +) ELSE (
13 + SET "_prog=node"
14 + SET PATHEXT=%PATHEXT:;.JS;=;%
15 +)
16 +
17 +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sshpk\bin\sshpk-verify" %*
1 +#!/usr/bin/env pwsh
2 +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3 +
4 +$exe=""
5 +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6 + # Fix case when both the Windows and Linux builds of Node
7 + # are installed in the same directory
8 + $exe=".exe"
9 +}
10 +$ret=0
11 +if (Test-Path "$basedir/node$exe") {
12 + # Support pipeline input
13 + if ($MyInvocation.ExpectingInput) {
14 + $input | & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
15 + } else {
16 + & "$basedir/node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
17 + }
18 + $ret=$LASTEXITCODE
19 +} else {
20 + # Support pipeline input
21 + if ($MyInvocation.ExpectingInput) {
22 + $input | & "node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
23 + } else {
24 + & "node$exe" "$basedir/../sshpk/bin/sshpk-verify" $args
25 + }
26 + $ret=$LASTEXITCODE
27 +}
28 +exit $ret
1 +#!/bin/sh
2 +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3 +
4 +case `uname` in
5 + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
6 +esac
7 +
8 +if [ -x "$basedir/node" ]; then
9 + exec "$basedir/node" "$basedir/../uuid/bin/uuid" "$@"
10 +else
11 + exec node "$basedir/../uuid/bin/uuid" "$@"
12 +fi
1 +@ECHO off
2 +GOTO start
3 +:find_dp0
4 +SET dp0=%~dp0
5 +EXIT /b
6 +:start
7 +SETLOCAL
8 +CALL :find_dp0
9 +
10 +IF EXIST "%dp0%\node.exe" (
11 + SET "_prog=%dp0%\node.exe"
12 +) ELSE (
13 + SET "_prog=node"
14 + SET PATHEXT=%PATHEXT:;.JS;=;%
15 +)
16 +
17 +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\uuid\bin\uuid" %*
1 +#!/usr/bin/env pwsh
2 +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
3 +
4 +$exe=""
5 +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
6 + # Fix case when both the Windows and Linux builds of Node
7 + # are installed in the same directory
8 + $exe=".exe"
9 +}
10 +$ret=0
11 +if (Test-Path "$basedir/node$exe") {
12 + # Support pipeline input
13 + if ($MyInvocation.ExpectingInput) {
14 + $input | & "$basedir/node$exe" "$basedir/../uuid/bin/uuid" $args
15 + } else {
16 + & "$basedir/node$exe" "$basedir/../uuid/bin/uuid" $args
17 + }
18 + $ret=$LASTEXITCODE
19 +} else {
20 + # Support pipeline input
21 + if ($MyInvocation.ExpectingInput) {
22 + $input | & "node$exe" "$basedir/../uuid/bin/uuid" $args
23 + } else {
24 + & "node$exe" "$basedir/../uuid/bin/uuid" $args
25 + }
26 + $ret=$LASTEXITCODE
27 +}
28 +exit $ret
This diff is collapsed. Click to expand it.
1 +var Ajv = require('ajv');
2 +var ajv = new Ajv({allErrors: true});
3 +
4 +var schema = {
5 + "properties": {
6 + "foo": { "type": "string" },
7 + "bar": { "type": "number", "maximum": 3 }
8 + }
9 +};
10 +
11 +var validate = ajv.compile(schema);
12 +
13 +test({"foo": "abc", "bar": 2});
14 +test({"foo": 2, "bar": 4});
15 +
16 +function test(data) {
17 + var valid = validate(data);
18 + if (valid) console.log('Valid!');
19 + else console.log('Invalid: ' + ajv.errorsText(validate.errors));
20 +}
...\ No newline at end of file ...\ No newline at end of file
1 +The MIT License (MIT)
2 +
3 +Copyright (c) 2015-2017 Evgeny Poberezkin
4 +
5 +Permission is hereby granted, free of charge, to any person obtaining a copy
6 +of this software and associated documentation files (the "Software"), to deal
7 +in the Software without restriction, including without limitation the rights
8 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 +copies of the Software, and to permit persons to whom the Software is
10 +furnished to do so, subject to the following conditions:
11 +
12 +The above copyright notice and this permission notice shall be included in all
13 +copies or substantial portions of the Software.
14 +
15 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 +SOFTWARE.
22 +
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +'use strict';
2 +
3 +
4 +var Cache = module.exports = function Cache() {
5 + this._cache = {};
6 +};
7 +
8 +
9 +Cache.prototype.put = function Cache_put(key, value) {
10 + this._cache[key] = value;
11 +};
12 +
13 +
14 +Cache.prototype.get = function Cache_get(key) {
15 + return this._cache[key];
16 +};
17 +
18 +
19 +Cache.prototype.del = function Cache_del(key) {
20 + delete this._cache[key];
21 +};
22 +
23 +
24 +Cache.prototype.clear = function Cache_clear() {
25 + this._cache = {};
26 +};
1 +'use strict';
2 +
3 +var MissingRefError = require('./error_classes').MissingRef;
4 +
5 +module.exports = compileAsync;
6 +
7 +
8 +/**
9 + * Creates validating function for passed schema with asynchronous loading of missing schemas.
10 + * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
11 + * @this Ajv
12 + * @param {Object} schema schema object
13 + * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped
14 + * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
15 + * @return {Promise} promise that resolves with a validating function.
16 + */
17 +function compileAsync(schema, meta, callback) {
18 + /* eslint no-shadow: 0 */
19 + /* global Promise */
20 + /* jshint validthis: true */
21 + var self = this;
22 + if (typeof this._opts.loadSchema != 'function')
23 + throw new Error('options.loadSchema should be a function');
24 +
25 + if (typeof meta == 'function') {
26 + callback = meta;
27 + meta = undefined;
28 + }
29 +
30 + var p = loadMetaSchemaOf(schema).then(function () {
31 + var schemaObj = self._addSchema(schema, undefined, meta);
32 + return schemaObj.validate || _compileAsync(schemaObj);
33 + });
34 +
35 + if (callback) {
36 + p.then(
37 + function(v) { callback(null, v); },
38 + callback
39 + );
40 + }
41 +
42 + return p;
43 +
44 +
45 + function loadMetaSchemaOf(sch) {
46 + var $schema = sch.$schema;
47 + return $schema && !self.getSchema($schema)
48 + ? compileAsync.call(self, { $ref: $schema }, true)
49 + : Promise.resolve();
50 + }
51 +
52 +
53 + function _compileAsync(schemaObj) {
54 + try { return self._compile(schemaObj); }
55 + catch(e) {
56 + if (e instanceof MissingRefError) return loadMissingSchema(e);
57 + throw e;
58 + }
59 +
60 +
61 + function loadMissingSchema(e) {
62 + var ref = e.missingSchema;
63 + if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');
64 +
65 + var schemaPromise = self._loadingSchemas[ref];
66 + if (!schemaPromise) {
67 + schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
68 + schemaPromise.then(removePromise, removePromise);
69 + }
70 +
71 + return schemaPromise.then(function (sch) {
72 + if (!added(ref)) {
73 + return loadMetaSchemaOf(sch).then(function () {
74 + if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
75 + });
76 + }
77 + }).then(function() {
78 + return _compileAsync(schemaObj);
79 + });
80 +
81 + function removePromise() {
82 + delete self._loadingSchemas[ref];
83 + }
84 +
85 + function added(ref) {
86 + return self._refs[ref] || self._schemas[ref];
87 + }
88 + }
89 + }
90 +}
1 +'use strict';
2 +
3 +// do NOT remove this file - it would break pre-compiled schemas
4 +// https://github.com/ajv-validator/ajv/issues/889
5 +module.exports = require('fast-deep-equal');
1 +'use strict';
2 +
3 +var resolve = require('./resolve');
4 +
5 +module.exports = {
6 + Validation: errorSubclass(ValidationError),
7 + MissingRef: errorSubclass(MissingRefError)
8 +};
9 +
10 +
11 +function ValidationError(errors) {
12 + this.message = 'validation failed';
13 + this.errors = errors;
14 + this.ajv = this.validation = true;
15 +}
16 +
17 +
18 +MissingRefError.message = function (baseId, ref) {
19 + return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
20 +};
21 +
22 +
23 +function MissingRefError(baseId, ref, message) {
24 + this.message = message || MissingRefError.message(baseId, ref);
25 + this.missingRef = resolve.url(baseId, ref);
26 + this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
27 +}
28 +
29 +
30 +function errorSubclass(Subclass) {
31 + Subclass.prototype = Object.create(Error.prototype);
32 + Subclass.prototype.constructor = Subclass;
33 + return Subclass;
34 +}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +'use strict';
2 +
3 +var URI = require('uri-js')
4 + , equal = require('fast-deep-equal')
5 + , util = require('./util')
6 + , SchemaObject = require('./schema_obj')
7 + , traverse = require('json-schema-traverse');
8 +
9 +module.exports = resolve;
10 +
11 +resolve.normalizeId = normalizeId;
12 +resolve.fullPath = getFullPath;
13 +resolve.url = resolveUrl;
14 +resolve.ids = resolveIds;
15 +resolve.inlineRef = inlineRef;
16 +resolve.schema = resolveSchema;
17 +
18 +/**
19 + * [resolve and compile the references ($ref)]
20 + * @this Ajv
21 + * @param {Function} compile reference to schema compilation funciton (localCompile)
22 + * @param {Object} root object with information about the root schema for the current schema
23 + * @param {String} ref reference to resolve
24 + * @return {Object|Function} schema object (if the schema can be inlined) or validation function
25 + */
26 +function resolve(compile, root, ref) {
27 + /* jshint validthis: true */
28 + var refVal = this._refs[ref];
29 + if (typeof refVal == 'string') {
30 + if (this._refs[refVal]) refVal = this._refs[refVal];
31 + else return resolve.call(this, compile, root, refVal);
32 + }
33 +
34 + refVal = refVal || this._schemas[ref];
35 + if (refVal instanceof SchemaObject) {
36 + return inlineRef(refVal.schema, this._opts.inlineRefs)
37 + ? refVal.schema
38 + : refVal.validate || this._compile(refVal);
39 + }
40 +
41 + var res = resolveSchema.call(this, root, ref);
42 + var schema, v, baseId;
43 + if (res) {
44 + schema = res.schema;
45 + root = res.root;
46 + baseId = res.baseId;
47 + }
48 +
49 + if (schema instanceof SchemaObject) {
50 + v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);
51 + } else if (schema !== undefined) {
52 + v = inlineRef(schema, this._opts.inlineRefs)
53 + ? schema
54 + : compile.call(this, schema, root, undefined, baseId);
55 + }
56 +
57 + return v;
58 +}
59 +
60 +
61 +/**
62 + * Resolve schema, its root and baseId
63 + * @this Ajv
64 + * @param {Object} root root object with properties schema, refVal, refs
65 + * @param {String} ref reference to resolve
66 + * @return {Object} object with properties schema, root, baseId
67 + */
68 +function resolveSchema(root, ref) {
69 + /* jshint validthis: true */
70 + var p = URI.parse(ref)
71 + , refPath = _getFullPath(p)
72 + , baseId = getFullPath(this._getId(root.schema));
73 + if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
74 + var id = normalizeId(refPath);
75 + var refVal = this._refs[id];
76 + if (typeof refVal == 'string') {
77 + return resolveRecursive.call(this, root, refVal, p);
78 + } else if (refVal instanceof SchemaObject) {
79 + if (!refVal.validate) this._compile(refVal);
80 + root = refVal;
81 + } else {
82 + refVal = this._schemas[id];
83 + if (refVal instanceof SchemaObject) {
84 + if (!refVal.validate) this._compile(refVal);
85 + if (id == normalizeId(ref))
86 + return { schema: refVal, root: root, baseId: baseId };
87 + root = refVal;
88 + } else {
89 + return;
90 + }
91 + }
92 + if (!root.schema) return;
93 + baseId = getFullPath(this._getId(root.schema));
94 + }
95 + return getJsonPointer.call(this, p, baseId, root.schema, root);
96 +}
97 +
98 +
99 +/* @this Ajv */
100 +function resolveRecursive(root, ref, parsedRef) {
101 + /* jshint validthis: true */
102 + var res = resolveSchema.call(this, root, ref);
103 + if (res) {
104 + var schema = res.schema;
105 + var baseId = res.baseId;
106 + root = res.root;
107 + var id = this._getId(schema);
108 + if (id) baseId = resolveUrl(baseId, id);
109 + return getJsonPointer.call(this, parsedRef, baseId, schema, root);
110 + }
111 +}
112 +
113 +
114 +var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);
115 +/* @this Ajv */
116 +function getJsonPointer(parsedRef, baseId, schema, root) {
117 + /* jshint validthis: true */
118 + parsedRef.fragment = parsedRef.fragment || '';
119 + if (parsedRef.fragment.slice(0,1) != '/') return;
120 + var parts = parsedRef.fragment.split('/');
121 +
122 + for (var i = 1; i < parts.length; i++) {
123 + var part = parts[i];
124 + if (part) {
125 + part = util.unescapeFragment(part);
126 + schema = schema[part];
127 + if (schema === undefined) break;
128 + var id;
129 + if (!PREVENT_SCOPE_CHANGE[part]) {
130 + id = this._getId(schema);
131 + if (id) baseId = resolveUrl(baseId, id);
132 + if (schema.$ref) {
133 + var $ref = resolveUrl(baseId, schema.$ref);
134 + var res = resolveSchema.call(this, root, $ref);
135 + if (res) {
136 + schema = res.schema;
137 + root = res.root;
138 + baseId = res.baseId;
139 + }
140 + }
141 + }
142 + }
143 + }
144 + if (schema !== undefined && schema !== root.schema)
145 + return { schema: schema, root: root, baseId: baseId };
146 +}
147 +
148 +
149 +var SIMPLE_INLINED = util.toHash([
150 + 'type', 'format', 'pattern',
151 + 'maxLength', 'minLength',
152 + 'maxProperties', 'minProperties',
153 + 'maxItems', 'minItems',
154 + 'maximum', 'minimum',
155 + 'uniqueItems', 'multipleOf',
156 + 'required', 'enum'
157 +]);
158 +function inlineRef(schema, limit) {
159 + if (limit === false) return false;
160 + if (limit === undefined || limit === true) return checkNoRef(schema);
161 + else if (limit) return countKeys(schema) <= limit;
162 +}
163 +
164 +
165 +function checkNoRef(schema) {
166 + var item;
167 + if (Array.isArray(schema)) {
168 + for (var i=0; i<schema.length; i++) {
169 + item = schema[i];
170 + if (typeof item == 'object' && !checkNoRef(item)) return false;
171 + }
172 + } else {
173 + for (var key in schema) {
174 + if (key == '$ref') return false;
175 + item = schema[key];
176 + if (typeof item == 'object' && !checkNoRef(item)) return false;
177 + }
178 + }
179 + return true;
180 +}
181 +
182 +
183 +function countKeys(schema) {
184 + var count = 0, item;
185 + if (Array.isArray(schema)) {
186 + for (var i=0; i<schema.length; i++) {
187 + item = schema[i];
188 + if (typeof item == 'object') count += countKeys(item);
189 + if (count == Infinity) return Infinity;
190 + }
191 + } else {
192 + for (var key in schema) {
193 + if (key == '$ref') return Infinity;
194 + if (SIMPLE_INLINED[key]) {
195 + count++;
196 + } else {
197 + item = schema[key];
198 + if (typeof item == 'object') count += countKeys(item) + 1;
199 + if (count == Infinity) return Infinity;
200 + }
201 + }
202 + }
203 + return count;
204 +}
205 +
206 +
207 +function getFullPath(id, normalize) {
208 + if (normalize !== false) id = normalizeId(id);
209 + var p = URI.parse(id);
210 + return _getFullPath(p);
211 +}
212 +
213 +
214 +function _getFullPath(p) {
215 + return URI.serialize(p).split('#')[0] + '#';
216 +}
217 +
218 +
219 +var TRAILING_SLASH_HASH = /#\/?$/;
220 +function normalizeId(id) {
221 + return id ? id.replace(TRAILING_SLASH_HASH, '') : '';
222 +}
223 +
224 +
225 +function resolveUrl(baseId, id) {
226 + id = normalizeId(id);
227 + return URI.resolve(baseId, id);
228 +}
229 +
230 +
231 +/* @this Ajv */
232 +function resolveIds(schema) {
233 + var schemaId = normalizeId(this._getId(schema));
234 + var baseIds = {'': schemaId};
235 + var fullPaths = {'': getFullPath(schemaId, false)};
236 + var localRefs = {};
237 + var self = this;
238 +
239 + traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
240 + if (jsonPtr === '') return;
241 + var id = self._getId(sch);
242 + var baseId = baseIds[parentJsonPtr];
243 + var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;
244 + if (keyIndex !== undefined)
245 + fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));
246 +
247 + if (typeof id == 'string') {
248 + id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);
249 +
250 + var refVal = self._refs[id];
251 + if (typeof refVal == 'string') refVal = self._refs[refVal];
252 + if (refVal && refVal.schema) {
253 + if (!equal(sch, refVal.schema))
254 + throw new Error('id "' + id + '" resolves to more than one schema');
255 + } else if (id != normalizeId(fullPath)) {
256 + if (id[0] == '#') {
257 + if (localRefs[id] && !equal(sch, localRefs[id]))
258 + throw new Error('id "' + id + '" resolves to more than one schema');
259 + localRefs[id] = sch;
260 + } else {
261 + self._refs[id] = fullPath;
262 + }
263 + }
264 + }
265 + baseIds[jsonPtr] = baseId;
266 + fullPaths[jsonPtr] = fullPath;
267 + });
268 +
269 + return localRefs;
270 +}
1 +'use strict';
2 +
3 +var ruleModules = require('../dotjs')
4 + , toHash = require('./util').toHash;
5 +
6 +module.exports = function rules() {
7 + var RULES = [
8 + { type: 'number',
9 + rules: [ { 'maximum': ['exclusiveMaximum'] },
10 + { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },
11 + { type: 'string',
12 + rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },
13 + { type: 'array',
14 + rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] },
15 + { type: 'object',
16 + rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',
17 + { 'properties': ['additionalProperties', 'patternProperties'] } ] },
18 + { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] }
19 + ];
20 +
21 + var ALL = [ 'type', '$comment' ];
22 + var KEYWORDS = [
23 + '$schema', '$id', 'id', '$data', '$async', 'title',
24 + 'description', 'default', 'definitions',
25 + 'examples', 'readOnly', 'writeOnly',
26 + 'contentMediaType', 'contentEncoding',
27 + 'additionalItems', 'then', 'else'
28 + ];
29 + var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];
30 + RULES.all = toHash(ALL);
31 + RULES.types = toHash(TYPES);
32 +
33 + RULES.forEach(function (group) {
34 + group.rules = group.rules.map(function (keyword) {
35 + var implKeywords;
36 + if (typeof keyword == 'object') {
37 + var key = Object.keys(keyword)[0];
38 + implKeywords = keyword[key];
39 + keyword = key;
40 + implKeywords.forEach(function (k) {
41 + ALL.push(k);
42 + RULES.all[k] = true;
43 + });
44 + }
45 + ALL.push(keyword);
46 + var rule = RULES.all[keyword] = {
47 + keyword: keyword,
48 + code: ruleModules[keyword],
49 + implements: implKeywords
50 + };
51 + return rule;
52 + });
53 +
54 + RULES.all.$comment = {
55 + keyword: '$comment',
56 + code: ruleModules.$comment
57 + };
58 +
59 + if (group.type) RULES.types[group.type] = group;
60 + });
61 +
62 + RULES.keywords = toHash(ALL.concat(KEYWORDS));
63 + RULES.custom = {};
64 +
65 + return RULES;
66 +};
1 +'use strict';
2 +
3 +var util = require('./util');
4 +
5 +module.exports = SchemaObject;
6 +
7 +function SchemaObject(obj) {
8 + util.copy(obj, this);
9 +}
1 +'use strict';
2 +
3 +// https://mathiasbynens.be/notes/javascript-encoding
4 +// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
5 +module.exports = function ucs2length(str) {
6 + var length = 0
7 + , len = str.length
8 + , pos = 0
9 + , value;
10 + while (pos < len) {
11 + length++;
12 + value = str.charCodeAt(pos++);
13 + if (value >= 0xD800 && value <= 0xDBFF && pos < len) {
14 + // high surrogate, and there is a next character
15 + value = str.charCodeAt(pos);
16 + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate
17 + }
18 + }
19 + return length;
20 +};
1 +'use strict';
2 +
3 +
4 +module.exports = {
5 + copy: copy,
6 + checkDataType: checkDataType,
7 + checkDataTypes: checkDataTypes,
8 + coerceToTypes: coerceToTypes,
9 + toHash: toHash,
10 + getProperty: getProperty,
11 + escapeQuotes: escapeQuotes,
12 + equal: require('fast-deep-equal'),
13 + ucs2length: require('./ucs2length'),
14 + varOccurences: varOccurences,
15 + varReplace: varReplace,
16 + schemaHasRules: schemaHasRules,
17 + schemaHasRulesExcept: schemaHasRulesExcept,
18 + schemaUnknownRules: schemaUnknownRules,
19 + toQuotedString: toQuotedString,
20 + getPathExpr: getPathExpr,
21 + getPath: getPath,
22 + getData: getData,
23 + unescapeFragment: unescapeFragment,
24 + unescapeJsonPointer: unescapeJsonPointer,
25 + escapeFragment: escapeFragment,
26 + escapeJsonPointer: escapeJsonPointer
27 +};
28 +
29 +
30 +function copy(o, to) {
31 + to = to || {};
32 + for (var key in o) to[key] = o[key];
33 + return to;
34 +}
35 +
36 +
37 +function checkDataType(dataType, data, strictNumbers, negate) {
38 + var EQUAL = negate ? ' !== ' : ' === '
39 + , AND = negate ? ' || ' : ' && '
40 + , OK = negate ? '!' : ''
41 + , NOT = negate ? '' : '!';
42 + switch (dataType) {
43 + case 'null': return data + EQUAL + 'null';
44 + case 'array': return OK + 'Array.isArray(' + data + ')';
45 + case 'object': return '(' + OK + data + AND +
46 + 'typeof ' + data + EQUAL + '"object"' + AND +
47 + NOT + 'Array.isArray(' + data + '))';
48 + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND +
49 + NOT + '(' + data + ' % 1)' +
50 + AND + data + EQUAL + data +
51 + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
52 + case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' +
53 + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';
54 + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"';
55 + }
56 +}
57 +
58 +
59 +function checkDataTypes(dataTypes, data, strictNumbers) {
60 + switch (dataTypes.length) {
61 + case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);
62 + default:
63 + var code = '';
64 + var types = toHash(dataTypes);
65 + if (types.array && types.object) {
66 + code = types.null ? '(': '(!' + data + ' || ';
67 + code += 'typeof ' + data + ' !== "object")';
68 + delete types.null;
69 + delete types.array;
70 + delete types.object;
71 + }
72 + if (types.number) delete types.integer;
73 + for (var t in types)
74 + code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);
75 +
76 + return code;
77 + }
78 +}
79 +
80 +
81 +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);
82 +function coerceToTypes(optionCoerceTypes, dataTypes) {
83 + if (Array.isArray(dataTypes)) {
84 + var types = [];
85 + for (var i=0; i<dataTypes.length; i++) {
86 + var t = dataTypes[i];
87 + if (COERCE_TO_TYPES[t]) types[types.length] = t;
88 + else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;
89 + }
90 + if (types.length) return types;
91 + } else if (COERCE_TO_TYPES[dataTypes]) {
92 + return [dataTypes];
93 + } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {
94 + return ['array'];
95 + }
96 +}
97 +
98 +
99 +function toHash(arr) {
100 + var hash = {};
101 + for (var i=0; i<arr.length; i++) hash[arr[i]] = true;
102 + return hash;
103 +}
104 +
105 +
106 +var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
107 +var SINGLE_QUOTE = /'|\\/g;
108 +function getProperty(key) {
109 + return typeof key == 'number'
110 + ? '[' + key + ']'
111 + : IDENTIFIER.test(key)
112 + ? '.' + key
113 + : "['" + escapeQuotes(key) + "']";
114 +}
115 +
116 +
117 +function escapeQuotes(str) {
118 + return str.replace(SINGLE_QUOTE, '\\$&')
119 + .replace(/\n/g, '\\n')
120 + .replace(/\r/g, '\\r')
121 + .replace(/\f/g, '\\f')
122 + .replace(/\t/g, '\\t');
123 +}
124 +
125 +
126 +function varOccurences(str, dataVar) {
127 + dataVar += '[^0-9]';
128 + var matches = str.match(new RegExp(dataVar, 'g'));
129 + return matches ? matches.length : 0;
130 +}
131 +
132 +
133 +function varReplace(str, dataVar, expr) {
134 + dataVar += '([^0-9])';
135 + expr = expr.replace(/\$/g, '$$$$');
136 + return str.replace(new RegExp(dataVar, 'g'), expr + '$1');
137 +}
138 +
139 +
140 +function schemaHasRules(schema, rules) {
141 + if (typeof schema == 'boolean') return !schema;
142 + for (var key in schema) if (rules[key]) return true;
143 +}
144 +
145 +
146 +function schemaHasRulesExcept(schema, rules, exceptKeyword) {
147 + if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';
148 + for (var key in schema) if (key != exceptKeyword && rules[key]) return true;
149 +}
150 +
151 +
152 +function schemaUnknownRules(schema, rules) {
153 + if (typeof schema == 'boolean') return;
154 + for (var key in schema) if (!rules[key]) return key;
155 +}
156 +
157 +
158 +function toQuotedString(str) {
159 + return '\'' + escapeQuotes(str) + '\'';
160 +}
161 +
162 +
163 +function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
164 + var path = jsonPointers // false by default
165 + ? '\'/\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \'~0\').replace(/\\//g, \'~1\')')
166 + : (isNumber ? '\'[\' + ' + expr + ' + \']\'' : '\'[\\\'\' + ' + expr + ' + \'\\\']\'');
167 + return joinPaths(currentPath, path);
168 +}
169 +
170 +
171 +function getPath(currentPath, prop, jsonPointers) {
172 + var path = jsonPointers // false by default
173 + ? toQuotedString('/' + escapeJsonPointer(prop))
174 + : toQuotedString(getProperty(prop));
175 + return joinPaths(currentPath, path);
176 +}
177 +
178 +
179 +var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
180 +var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
181 +function getData($data, lvl, paths) {
182 + var up, jsonPointer, data, matches;
183 + if ($data === '') return 'rootData';
184 + if ($data[0] == '/') {
185 + if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);
186 + jsonPointer = $data;
187 + data = 'rootData';
188 + } else {
189 + matches = $data.match(RELATIVE_JSON_POINTER);
190 + if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
191 + up = +matches[1];
192 + jsonPointer = matches[2];
193 + if (jsonPointer == '#') {
194 + if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
195 + return paths[lvl - up];
196 + }
197 +
198 + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
199 + data = 'data' + ((lvl - up) || '');
200 + if (!jsonPointer) return data;
201 + }
202 +
203 + var expr = data;
204 + var segments = jsonPointer.split('/');
205 + for (var i=0; i<segments.length; i++) {
206 + var segment = segments[i];
207 + if (segment) {
208 + data += getProperty(unescapeJsonPointer(segment));
209 + expr += ' && ' + data;
210 + }
211 + }
212 + return expr;
213 +}
214 +
215 +
216 +function joinPaths (a, b) {
217 + if (a == '""') return b;
218 + return (a + ' + ' + b).replace(/([^\\])' \+ '/g, '$1');
219 +}
220 +
221 +
222 +function unescapeFragment(str) {
223 + return unescapeJsonPointer(decodeURIComponent(str));
224 +}
225 +
226 +
227 +function escapeFragment(str) {
228 + return encodeURIComponent(escapeJsonPointer(str));
229 +}
230 +
231 +
232 +function escapeJsonPointer(str) {
233 + return str.replace(/~/g, '~0').replace(/\//g, '~1');
234 +}
235 +
236 +
237 +function unescapeJsonPointer(str) {
238 + return str.replace(/~1/g, '/').replace(/~0/g, '~');
239 +}
1 +'use strict';
2 +
3 +var KEYWORDS = [
4 + 'multipleOf',
5 + 'maximum',
6 + 'exclusiveMaximum',
7 + 'minimum',
8 + 'exclusiveMinimum',
9 + 'maxLength',
10 + 'minLength',
11 + 'pattern',
12 + 'additionalItems',
13 + 'maxItems',
14 + 'minItems',
15 + 'uniqueItems',
16 + 'maxProperties',
17 + 'minProperties',
18 + 'required',
19 + 'additionalProperties',
20 + 'enum',
21 + 'format',
22 + 'const'
23 +];
24 +
25 +module.exports = function (metaSchema, keywordsJsonPointers) {
26 + for (var i=0; i<keywordsJsonPointers.length; i++) {
27 + metaSchema = JSON.parse(JSON.stringify(metaSchema));
28 + var segments = keywordsJsonPointers[i].split('/');
29 + var keywords = metaSchema;
30 + var j;
31 + for (j=1; j<segments.length; j++)
32 + keywords = keywords[segments[j]];
33 +
34 + for (j=0; j<KEYWORDS.length; j++) {
35 + var key = KEYWORDS[j];
36 + var schema = keywords[key];
37 + if (schema) {
38 + keywords[key] = {
39 + anyOf: [
40 + schema,
41 + { $ref: 'https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#' }
42 + ]
43 + };
44 + }
45 + }
46 + }
47 +
48 + return metaSchema;
49 +};
1 +'use strict';
2 +
3 +var metaSchema = require('./refs/json-schema-draft-07.json');
4 +
5 +module.exports = {
6 + $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js',
7 + definitions: {
8 + simpleTypes: metaSchema.definitions.simpleTypes
9 + },
10 + type: 'object',
11 + dependencies: {
12 + schema: ['validate'],
13 + $data: ['validate'],
14 + statements: ['inline'],
15 + valid: {not: {required: ['macro']}}
16 + },
17 + properties: {
18 + type: metaSchema.properties.type,
19 + schema: {type: 'boolean'},
20 + statements: {type: 'boolean'},
21 + dependencies: {
22 + type: 'array',
23 + items: {type: 'string'}
24 + },
25 + metaSchema: {type: 'object'},
26 + modifying: {type: 'boolean'},
27 + valid: {type: 'boolean'},
28 + $data: {type: 'boolean'},
29 + async: {type: 'boolean'},
30 + errors: {
31 + anyOf: [
32 + {type: 'boolean'},
33 + {const: 'full'}
34 + ]
35 + }
36 + }
37 +};
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{## def.setExclusiveLimit:
7 + $exclusive = true;
8 + $errorKeyword = $exclusiveKeyword;
9 + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
10 +#}}
11 +
12 +{{
13 + var $isMax = $keyword == 'maximum'
14 + , $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum'
15 + , $schemaExcl = it.schema[$exclusiveKeyword]
16 + , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data
17 + , $op = $isMax ? '<' : '>'
18 + , $notOp = $isMax ? '>' : '<'
19 + , $errorKeyword = undefined;
20 +
21 + if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
22 + throw new Error($keyword + ' must be number');
23 + }
24 + if (!($isDataExcl || $schemaExcl === undefined
25 + || typeof $schemaExcl == 'number'
26 + || typeof $schemaExcl == 'boolean')) {
27 + throw new Error($exclusiveKeyword + ' must be number or boolean');
28 + }
29 +}}
30 +
31 +{{? $isDataExcl }}
32 + {{
33 + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)
34 + , $exclusive = 'exclusive' + $lvl
35 + , $exclType = 'exclType' + $lvl
36 + , $exclIsNumber = 'exclIsNumber' + $lvl
37 + , $opExpr = 'op' + $lvl
38 + , $opStr = '\' + ' + $opExpr + ' + \'';
39 + }}
40 + var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};
41 + {{ $schemaValueExcl = 'schemaExcl' + $lvl; }}
42 +
43 + var {{=$exclusive}};
44 + var {{=$exclType}} = typeof {{=$schemaValueExcl}};
45 + if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') {
46 + {{ var $errorKeyword = $exclusiveKeyword; }}
47 + {{# def.error:'_exclusiveLimit' }}
48 + } else if ({{# def.$dataNotType:'number' }}
49 + {{=$exclType}} == 'number'
50 + ? (
51 + ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}})
52 + ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}}
53 + : {{=$data}} {{=$notOp}} {{=$schemaValue}}
54 + )
55 + : (
56 + ({{=$exclusive}} = {{=$schemaValueExcl}} === true)
57 + ? {{=$data}} {{=$notOp}}= {{=$schemaValue}}
58 + : {{=$data}} {{=$notOp}} {{=$schemaValue}}
59 + )
60 + || {{=$data}} !== {{=$data}}) {
61 + var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';
62 + {{
63 + if ($schema === undefined) {
64 + $errorKeyword = $exclusiveKeyword;
65 + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
66 + $schemaValue = $schemaValueExcl;
67 + $isData = $isDataExcl;
68 + }
69 + }}
70 +{{??}}
71 + {{
72 + var $exclIsNumber = typeof $schemaExcl == 'number'
73 + , $opStr = $op; /*used in error*/
74 + }}
75 +
76 + {{? $exclIsNumber && $isData }}
77 + {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }}
78 + if ({{# def.$dataNotType:'number' }}
79 + ( {{=$schemaValue}} === undefined
80 + || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}}
81 + ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}}
82 + : {{=$data}} {{=$notOp}} {{=$schemaValue}} )
83 + || {{=$data}} !== {{=$data}}) {
84 + {{??}}
85 + {{
86 + if ($exclIsNumber && $schema === undefined) {
87 + {{# def.setExclusiveLimit }}
88 + $schemaValue = $schemaExcl;
89 + $notOp += '=';
90 + } else {
91 + if ($exclIsNumber)
92 + $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
93 +
94 + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
95 + {{# def.setExclusiveLimit }}
96 + $notOp += '=';
97 + } else {
98 + $exclusive = false;
99 + $opStr += '=';
100 + }
101 + }
102 +
103 + var $opExpr = '\'' + $opStr + '\''; /*used in error*/
104 + }}
105 +
106 + if ({{# def.$dataNotType:'number' }}
107 + {{=$data}} {{=$notOp}} {{=$schemaValue}}
108 + || {{=$data}} !== {{=$data}}) {
109 + {{?}}
110 +{{?}}
111 + {{ $errorKeyword = $errorKeyword || $keyword; }}
112 + {{# def.error:'_limit' }}
113 + } {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{# def.numberKeyword }}
7 +
8 +{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }}
9 +if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) {
10 + {{ var $errorKeyword = $keyword; }}
11 + {{# def.error:'_limitItems' }}
12 +} {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{# def.numberKeyword }}
7 +
8 +{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }}
9 +if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) {
10 + {{ var $errorKeyword = $keyword; }}
11 + {{# def.error:'_limitLength' }}
12 +} {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{# def.numberKeyword }}
7 +
8 +{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }}
9 +if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) {
10 + {{ var $errorKeyword = $keyword; }}
11 + {{# def.error:'_limitProperties' }}
12 +} {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +{{
7 + var $currentBaseId = $it.baseId
8 + , $allSchemasEmpty = true;
9 +}}
10 +
11 +{{~ $schema:$sch:$i }}
12 + {{? {{# def.nonEmptySchema:$sch }} }}
13 + {{
14 + $allSchemasEmpty = false;
15 + $it.schema = $sch;
16 + $it.schemaPath = $schemaPath + '[' + $i + ']';
17 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
18 + }}
19 +
20 + {{# def.insertSubschemaCode }}
21 +
22 + {{# def.ifResultValid }}
23 + {{?}}
24 +{{~}}
25 +
26 +{{? $breakOnError }}
27 + {{? $allSchemasEmpty }}
28 + if (true) {
29 + {{??}}
30 + {{= $closingBraces.slice(0,-1) }}
31 + {{?}}
32 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +{{
7 + var $noEmptySchema = $schema.every(function($sch) {
8 + return {{# def.nonEmptySchema:$sch }};
9 + });
10 +}}
11 +{{? $noEmptySchema }}
12 + {{ var $currentBaseId = $it.baseId; }}
13 + var {{=$errs}} = errors;
14 + var {{=$valid}} = false;
15 +
16 + {{# def.setCompositeRule }}
17 +
18 + {{~ $schema:$sch:$i }}
19 + {{
20 + $it.schema = $sch;
21 + $it.schemaPath = $schemaPath + '[' + $i + ']';
22 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
23 + }}
24 +
25 + {{# def.insertSubschemaCode }}
26 +
27 + {{=$valid}} = {{=$valid}} || {{=$nextValid}};
28 +
29 + if (!{{=$valid}}) {
30 + {{ $closingBraces += '}'; }}
31 + {{~}}
32 +
33 + {{# def.resetCompositeRule }}
34 +
35 + {{= $closingBraces }}
36 +
37 + if (!{{=$valid}}) {
38 + {{# def.extraError:'anyOf' }}
39 + } else {
40 + {{# def.resetErrors }}
41 + {{? it.opts.allErrors }} } {{?}}
42 +{{??}}
43 + {{? $breakOnError }}
44 + if (true) {
45 + {{?}}
46 +{{?}}
1 +{{## def.coerceType:
2 + {{
3 + var $dataType = 'dataType' + $lvl
4 + , $coerced = 'coerced' + $lvl;
5 + }}
6 + var {{=$dataType}} = typeof {{=$data}};
7 + var {{=$coerced}} = undefined;
8 +
9 + {{? it.opts.coerceTypes == 'array' }}
10 + if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) {
11 + {{=$data}} = {{=$data}}[0];
12 + {{=$dataType}} = typeof {{=$data}};
13 + if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}};
14 + }
15 + {{?}}
16 +
17 + if ({{=$coerced}} !== undefined) ;
18 + {{~ $coerceToTypes:$type:$i }}
19 + {{? $type == 'string' }}
20 + else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean')
21 + {{=$coerced}} = '' + {{=$data}};
22 + else if ({{=$data}} === null) {{=$coerced}} = '';
23 + {{?? $type == 'number' || $type == 'integer' }}
24 + else if ({{=$dataType}} == 'boolean' || {{=$data}} === null
25 + || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}}
26 + {{? $type == 'integer' }} && !({{=$data}} % 1){{?}}))
27 + {{=$coerced}} = +{{=$data}};
28 + {{?? $type == 'boolean' }}
29 + else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null)
30 + {{=$coerced}} = false;
31 + else if ({{=$data}} === 'true' || {{=$data}} === 1)
32 + {{=$coerced}} = true;
33 + {{?? $type == 'null' }}
34 + else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false)
35 + {{=$coerced}} = null;
36 + {{?? it.opts.coerceTypes == 'array' && $type == 'array' }}
37 + else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null)
38 + {{=$coerced}} = [{{=$data}}];
39 + {{?}}
40 + {{~}}
41 + else {
42 + {{# def.error:'type' }}
43 + }
44 +
45 + if ({{=$coerced}} !== undefined) {
46 + {{# def.setParentData }}
47 + {{=$data}} = {{=$coerced}};
48 + {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}}
49 + {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}};
50 + }
51 +#}}
1 +{{# def.definitions }}
2 +{{# def.setupKeyword }}
3 +
4 +{{ var $comment = it.util.toQuotedString($schema); }}
5 +{{? it.opts.$comment === true }}
6 + console.log({{=$comment}});
7 +{{?? typeof it.opts.$comment == 'function' }}
8 + self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema);
9 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{? !$isData }}
7 + var schema{{=$lvl}} = validate.schema{{=$schemaPath}};
8 +{{?}}
9 +var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}});
10 +{{# def.checkError:'const' }}
11 +{{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +
7 +{{
8 + var $idx = 'i' + $lvl
9 + , $dataNxt = $it.dataLevel = it.dataLevel + 1
10 + , $nextData = 'data' + $dataNxt
11 + , $currentBaseId = it.baseId
12 + , $nonEmptySchema = {{# def.nonEmptySchema:$schema }};
13 +}}
14 +
15 +var {{=$errs}} = errors;
16 +var {{=$valid}};
17 +
18 +{{? $nonEmptySchema }}
19 + {{# def.setCompositeRule }}
20 +
21 + {{
22 + $it.schema = $schema;
23 + $it.schemaPath = $schemaPath;
24 + $it.errSchemaPath = $errSchemaPath;
25 + }}
26 +
27 + var {{=$nextValid}} = false;
28 +
29 + for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
30 + {{
31 + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
32 + var $passData = $data + '[' + $idx + ']';
33 + $it.dataPathArr[$dataNxt] = $idx;
34 + }}
35 +
36 + {{# def.generateSubschemaCode }}
37 + {{# def.optimizeValidate }}
38 +
39 + if ({{=$nextValid}}) break;
40 + }
41 +
42 + {{# def.resetCompositeRule }}
43 + {{= $closingBraces }}
44 +
45 + if (!{{=$nextValid}}) {
46 +{{??}}
47 + if ({{=$data}}.length == 0) {
48 +{{?}}
49 +
50 + {{# def.error:'contains' }}
51 + } else {
52 + {{? $nonEmptySchema }}
53 + {{# def.resetErrors }}
54 + {{?}}
55 + {{? it.opts.allErrors }} } {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{
7 + var $rule = this
8 + , $definition = 'definition' + $lvl
9 + , $rDef = $rule.definition
10 + , $closingBraces = '';
11 + var $validate = $rDef.validate;
12 + var $compile, $inline, $macro, $ruleValidate, $validateCode;
13 +}}
14 +
15 +{{? $isData && $rDef.$data }}
16 + {{
17 + $validateCode = 'keywordValidate' + $lvl;
18 + var $validateSchema = $rDef.validateSchema;
19 + }}
20 + var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition;
21 + var {{=$validateCode}} = {{=$definition}}.validate;
22 +{{??}}
23 + {{
24 + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
25 + if (!$ruleValidate) return;
26 + $schemaValue = 'validate.schema' + $schemaPath;
27 + $validateCode = $ruleValidate.code;
28 + $compile = $rDef.compile;
29 + $inline = $rDef.inline;
30 + $macro = $rDef.macro;
31 + }}
32 +{{?}}
33 +
34 +{{
35 + var $ruleErrs = $validateCode + '.errors'
36 + , $i = 'i' + $lvl
37 + , $ruleErr = 'ruleErr' + $lvl
38 + , $asyncKeyword = $rDef.async;
39 +
40 + if ($asyncKeyword && !it.async)
41 + throw new Error('async keyword in sync schema');
42 +}}
43 +
44 +
45 +{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}}
46 +var {{=$errs}} = errors;
47 +var {{=$valid}};
48 +
49 +{{## def.callRuleValidate:
50 + {{=$validateCode}}.call(
51 + {{? it.opts.passContext }}this{{??}}self{{?}}
52 + {{? $compile || $rDef.schema === false }}
53 + , {{=$data}}
54 + {{??}}
55 + , {{=$schemaValue}}
56 + , {{=$data}}
57 + , validate.schema{{=it.schemaPath}}
58 + {{?}}
59 + , {{# def.dataPath }}
60 + {{# def.passParentData }}
61 + , rootData
62 + )
63 +#}}
64 +
65 +{{## def.extendErrors:_inline:
66 + for (var {{=$i}}={{=$errs}}; {{=$i}}<errors; {{=$i}}++) {
67 + var {{=$ruleErr}} = vErrors[{{=$i}}];
68 + if ({{=$ruleErr}}.dataPath === undefined)
69 + {{=$ruleErr}}.dataPath = (dataPath || '') + {{= it.errorPath }};
70 + {{# _inline ? 'if (\{\{=$ruleErr\}\}.schemaPath === undefined) {' : '' }}
71 + {{=$ruleErr}}.schemaPath = "{{=$errSchemaPath}}";
72 + {{# _inline ? '}' : '' }}
73 + {{? it.opts.verbose }}
74 + {{=$ruleErr}}.schema = {{=$schemaValue}};
75 + {{=$ruleErr}}.data = {{=$data}};
76 + {{?}}
77 + }
78 +#}}
79 +
80 +
81 +{{? $isData && $rDef.$data }}
82 + {{ $closingBraces += '}'; }}
83 + if ({{=$schemaValue}} === undefined) {
84 + {{=$valid}} = true;
85 + } else {
86 + {{? $validateSchema }}
87 + {{ $closingBraces += '}'; }}
88 + {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}});
89 + if ({{=$valid}}) {
90 + {{?}}
91 +{{?}}
92 +
93 +{{? $inline }}
94 + {{? $rDef.statements }}
95 + {{= $ruleValidate.validate }}
96 + {{??}}
97 + {{=$valid}} = {{= $ruleValidate.validate }};
98 + {{?}}
99 +{{?? $macro }}
100 + {{# def.setupNextLevel }}
101 + {{
102 + $it.schema = $ruleValidate.validate;
103 + $it.schemaPath = '';
104 + }}
105 + {{# def.setCompositeRule }}
106 + {{ var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); }}
107 + {{# def.resetCompositeRule }}
108 + {{= $code }}
109 +{{??}}
110 + {{# def.beginDefOut}}
111 + {{# def.callRuleValidate }}
112 + {{# def.storeDefOut:def_callRuleValidate }}
113 +
114 + {{? $rDef.errors === false }}
115 + {{=$valid}} = {{? $asyncKeyword }}await {{?}}{{= def_callRuleValidate }};
116 + {{??}}
117 + {{? $asyncKeyword }}
118 + {{ $ruleErrs = 'customErrors' + $lvl; }}
119 + var {{=$ruleErrs}} = null;
120 + try {
121 + {{=$valid}} = await {{= def_callRuleValidate }};
122 + } catch (e) {
123 + {{=$valid}} = false;
124 + if (e instanceof ValidationError) {{=$ruleErrs}} = e.errors;
125 + else throw e;
126 + }
127 + {{??}}
128 + {{=$ruleErrs}} = null;
129 + {{=$valid}} = {{= def_callRuleValidate }};
130 + {{?}}
131 + {{?}}
132 +{{?}}
133 +
134 +{{? $rDef.modifying }}
135 + if ({{=$parentData}}) {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}];
136 +{{?}}
137 +
138 +{{= $closingBraces }}
139 +
140 +{{## def.notValidationResult:
141 + {{? $rDef.valid === undefined }}
142 + !{{? $macro }}{{=$nextValid}}{{??}}{{=$valid}}{{?}}
143 + {{??}}
144 + {{= !$rDef.valid }}
145 + {{?}}
146 +#}}
147 +
148 +{{? $rDef.valid }}
149 + {{? $breakOnError }} if (true) { {{?}}
150 +{{??}}
151 + if ({{# def.notValidationResult }}) {
152 + {{ $errorKeyword = $rule.keyword; }}
153 + {{# def.beginDefOut}}
154 + {{# def.error:'custom' }}
155 + {{# def.storeDefOut:def_customError }}
156 +
157 + {{? $inline }}
158 + {{? $rDef.errors }}
159 + {{? $rDef.errors != 'full' }}
160 + {{# def.extendErrors:true }}
161 + {{?}}
162 + {{??}}
163 + {{? $rDef.errors === false}}
164 + {{= def_customError }}
165 + {{??}}
166 + if ({{=$errs}} == errors) {
167 + {{= def_customError }}
168 + } else {
169 + {{# def.extendErrors:true }}
170 + }
171 + {{?}}
172 + {{?}}
173 + {{?? $macro }}
174 + {{# def.extraError:'custom' }}
175 + {{??}}
176 + {{? $rDef.errors === false}}
177 + {{= def_customError }}
178 + {{??}}
179 + if (Array.isArray({{=$ruleErrs}})) {
180 + if (vErrors === null) vErrors = {{=$ruleErrs}};
181 + else vErrors = vErrors.concat({{=$ruleErrs}});
182 + errors = vErrors.length;
183 + {{# def.extendErrors:false }}
184 + } else {
185 + {{= def_customError }}
186 + }
187 + {{?}}
188 + {{?}}
189 +
190 + } {{? $breakOnError }} else { {{?}}
191 +{{?}}
1 +{{## def.assignDefault:
2 + {{? it.compositeRule }}
3 + {{
4 + if (it.opts.strictDefaults) {
5 + var $defaultMsg = 'default is ignored for: ' + $passData;
6 + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
7 + else throw new Error($defaultMsg);
8 + }
9 + }}
10 + {{??}}
11 + if ({{=$passData}} === undefined
12 + {{? it.opts.useDefaults == 'empty' }}
13 + || {{=$passData}} === null
14 + || {{=$passData}} === ''
15 + {{?}}
16 + )
17 + {{=$passData}} = {{? it.opts.useDefaults == 'shared' }}
18 + {{= it.useDefault($sch.default) }}
19 + {{??}}
20 + {{= JSON.stringify($sch.default) }}
21 + {{?}};
22 + {{?}}
23 +#}}
24 +
25 +
26 +{{## def.defaultProperties:
27 + {{
28 + var $schema = it.schema.properties
29 + , $schemaKeys = Object.keys($schema); }}
30 + {{~ $schemaKeys:$propertyKey }}
31 + {{ var $sch = $schema[$propertyKey]; }}
32 + {{? $sch.default !== undefined }}
33 + {{ var $passData = $data + it.util.getProperty($propertyKey); }}
34 + {{# def.assignDefault }}
35 + {{?}}
36 + {{~}}
37 +#}}
38 +
39 +
40 +{{## def.defaultItems:
41 + {{~ it.schema.items:$sch:$i }}
42 + {{? $sch.default !== undefined }}
43 + {{ var $passData = $data + '[' + $i + ']'; }}
44 + {{# def.assignDefault }}
45 + {{?}}
46 + {{~}}
47 +#}}
1 +{{## def.setupKeyword:
2 + {{
3 + var $lvl = it.level;
4 + var $dataLvl = it.dataLevel;
5 + var $schema = it.schema[$keyword];
6 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
7 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
8 + var $breakOnError = !it.opts.allErrors;
9 + var $errorKeyword;
10 +
11 + var $data = 'data' + ($dataLvl || '');
12 + var $valid = 'valid' + $lvl;
13 + var $errs = 'errs__' + $lvl;
14 + }}
15 +#}}
16 +
17 +
18 +{{## def.setCompositeRule:
19 + {{
20 + var $wasComposite = it.compositeRule;
21 + it.compositeRule = $it.compositeRule = true;
22 + }}
23 +#}}
24 +
25 +
26 +{{## def.resetCompositeRule:
27 + {{ it.compositeRule = $it.compositeRule = $wasComposite; }}
28 +#}}
29 +
30 +
31 +{{## def.setupNextLevel:
32 + {{
33 + var $it = it.util.copy(it);
34 + var $closingBraces = '';
35 + $it.level++;
36 + var $nextValid = 'valid' + $it.level;
37 + }}
38 +#}}
39 +
40 +
41 +{{## def.ifValid:
42 + {{? $breakOnError }}
43 + if ({{=$valid}}) {
44 + {{ $closingBraces += '}'; }}
45 + {{?}}
46 +#}}
47 +
48 +
49 +{{## def.ifResultValid:
50 + {{? $breakOnError }}
51 + if ({{=$nextValid}}) {
52 + {{ $closingBraces += '}'; }}
53 + {{?}}
54 +#}}
55 +
56 +
57 +{{## def.elseIfValid:
58 + {{? $breakOnError }}
59 + {{ $closingBraces += '}'; }}
60 + else {
61 + {{?}}
62 +#}}
63 +
64 +
65 +{{## def.nonEmptySchema:_schema:
66 + (it.opts.strictKeywords
67 + ? (typeof _schema == 'object' && Object.keys(_schema).length > 0)
68 + || _schema === false
69 + : it.util.schemaHasRules(_schema, it.RULES.all))
70 +#}}
71 +
72 +
73 +{{## def.strLength:
74 + {{? it.opts.unicode === false }}
75 + {{=$data}}.length
76 + {{??}}
77 + ucs2length({{=$data}})
78 + {{?}}
79 +#}}
80 +
81 +
82 +{{## def.willOptimize:
83 + it.util.varOccurences($code, $nextData) < 2
84 +#}}
85 +
86 +
87 +{{## def.generateSubschemaCode:
88 + {{
89 + var $code = it.validate($it);
90 + $it.baseId = $currentBaseId;
91 + }}
92 +#}}
93 +
94 +
95 +{{## def.insertSubschemaCode:
96 + {{= it.validate($it) }}
97 + {{ $it.baseId = $currentBaseId; }}
98 +#}}
99 +
100 +
101 +{{## def._optimizeValidate:
102 + it.util.varReplace($code, $nextData, $passData)
103 +#}}
104 +
105 +
106 +{{## def.optimizeValidate:
107 + {{? {{# def.willOptimize}} }}
108 + {{= {{# def._optimizeValidate }} }}
109 + {{??}}
110 + var {{=$nextData}} = {{=$passData}};
111 + {{= $code }}
112 + {{?}}
113 +#}}
114 +
115 +
116 +{{## def.$data:
117 + {{
118 + var $isData = it.opts.$data && $schema && $schema.$data
119 + , $schemaValue;
120 + }}
121 + {{? $isData }}
122 + var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }};
123 + {{ $schemaValue = 'schema' + $lvl; }}
124 + {{??}}
125 + {{ $schemaValue = $schema; }}
126 + {{?}}
127 +#}}
128 +
129 +
130 +{{## def.$dataNotType:_type:
131 + {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}}
132 +#}}
133 +
134 +
135 +{{## def.check$dataIsArray:
136 + if (schema{{=$lvl}} === undefined) {{=$valid}} = true;
137 + else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false;
138 + else {
139 +#}}
140 +
141 +
142 +{{## def.numberKeyword:
143 + {{? !($isData || typeof $schema == 'number') }}
144 + {{ throw new Error($keyword + ' must be number'); }}
145 + {{?}}
146 +#}}
147 +
148 +
149 +{{## def.beginDefOut:
150 + {{
151 + var $$outStack = $$outStack || [];
152 + $$outStack.push(out);
153 + out = '';
154 + }}
155 +#}}
156 +
157 +
158 +{{## def.storeDefOut:_variable:
159 + {{
160 + var _variable = out;
161 + out = $$outStack.pop();
162 + }}
163 +#}}
164 +
165 +
166 +{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}}
167 +
168 +{{## def.setParentData:
169 + {{
170 + var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData'
171 + , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
172 + }}
173 +#}}
174 +
175 +{{## def.passParentData:
176 + {{# def.setParentData }}
177 + , {{= $parentData }}
178 + , {{= $parentDataProperty }}
179 +#}}
180 +
181 +
182 +{{## def.iterateProperties:
183 + {{? $ownProperties }}
184 + {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}});
185 + for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) {
186 + var {{=$key}} = {{=$dataProperties}}[{{=$idx}}];
187 + {{??}}
188 + for (var {{=$key}} in {{=$data}}) {
189 + {{?}}
190 +#}}
191 +
192 +
193 +{{## def.noPropertyInData:
194 + {{=$useData}} === undefined
195 + {{? $ownProperties }}
196 + || !{{# def.isOwnProperty }}
197 + {{?}}
198 +#}}
199 +
200 +
201 +{{## def.isOwnProperty:
202 + Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}')
203 +#}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.missing }}
4 +{{# def.setupKeyword }}
5 +{{# def.setupNextLevel }}
6 +
7 +
8 +{{## def.propertyInData:
9 + {{=$data}}{{= it.util.getProperty($property) }} !== undefined
10 + {{? $ownProperties }}
11 + && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}')
12 + {{?}}
13 +#}}
14 +
15 +
16 +{{
17 + var $schemaDeps = {}
18 + , $propertyDeps = {}
19 + , $ownProperties = it.opts.ownProperties;
20 +
21 + for ($property in $schema) {
22 + if ($property == '__proto__') continue;
23 + var $sch = $schema[$property];
24 + var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
25 + $deps[$property] = $sch;
26 + }
27 +}}
28 +
29 +var {{=$errs}} = errors;
30 +
31 +{{ var $currentErrorPath = it.errorPath; }}
32 +
33 +var missing{{=$lvl}};
34 +{{ for (var $property in $propertyDeps) { }}
35 + {{ $deps = $propertyDeps[$property]; }}
36 + {{? $deps.length }}
37 + if ({{# def.propertyInData }}
38 + {{? $breakOnError }}
39 + && ({{# def.checkMissingProperty:$deps }})) {
40 + {{# def.errorMissingProperty:'dependencies' }}
41 + {{??}}
42 + ) {
43 + {{~ $deps:$propertyKey }}
44 + {{# def.allErrorsMissingProperty:'dependencies' }}
45 + {{~}}
46 + {{?}}
47 + } {{# def.elseIfValid }}
48 + {{?}}
49 +{{ } }}
50 +
51 +{{
52 + it.errorPath = $currentErrorPath;
53 + var $currentBaseId = $it.baseId;
54 +}}
55 +
56 +
57 +{{ for (var $property in $schemaDeps) { }}
58 + {{ var $sch = $schemaDeps[$property]; }}
59 + {{? {{# def.nonEmptySchema:$sch }} }}
60 + {{=$nextValid}} = true;
61 +
62 + if ({{# def.propertyInData }}) {
63 + {{
64 + $it.schema = $sch;
65 + $it.schemaPath = $schemaPath + it.util.getProperty($property);
66 + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
67 + }}
68 +
69 + {{# def.insertSubschemaCode }}
70 + }
71 +
72 + {{# def.ifResultValid }}
73 + {{?}}
74 +{{ } }}
75 +
76 +{{? $breakOnError }}
77 + {{= $closingBraces }}
78 + if ({{=$errs}} == errors) {
79 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{
7 + var $i = 'i' + $lvl
8 + , $vSchema = 'schema' + $lvl;
9 +}}
10 +
11 +{{? !$isData }}
12 + var {{=$vSchema}} = validate.schema{{=$schemaPath}};
13 +{{?}}
14 +var {{=$valid}};
15 +
16 +{{?$isData}}{{# def.check$dataIsArray }}{{?}}
17 +
18 +{{=$valid}} = false;
19 +
20 +for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++)
21 + if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) {
22 + {{=$valid}} = true;
23 + break;
24 + }
25 +
26 +{{? $isData }} } {{?}}
27 +
28 +{{# def.checkError:'enum' }}
29 +
30 +{{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +
3 +{{## def._error:_rule:
4 + {{ 'istanbul ignore else'; }}
5 + {{? it.createErrors !== false }}
6 + {
7 + keyword: '{{= $errorKeyword || _rule }}'
8 + , dataPath: (dataPath || '') + {{= it.errorPath }}
9 + , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}}
10 + , params: {{# def._errorParams[_rule] }}
11 + {{? it.opts.messages !== false }}
12 + , message: {{# def._errorMessages[_rule] }}
13 + {{?}}
14 + {{? it.opts.verbose }}
15 + , schema: {{# def._errorSchemas[_rule] }}
16 + , parentSchema: validate.schema{{=it.schemaPath}}
17 + , data: {{=$data}}
18 + {{?}}
19 + }
20 + {{??}}
21 + {}
22 + {{?}}
23 +#}}
24 +
25 +
26 +{{## def._addError:_rule:
27 + if (vErrors === null) vErrors = [err];
28 + else vErrors.push(err);
29 + errors++;
30 +#}}
31 +
32 +
33 +{{## def.addError:_rule:
34 + var err = {{# def._error:_rule }};
35 + {{# def._addError:_rule }}
36 +#}}
37 +
38 +
39 +{{## def.error:_rule:
40 + {{# def.beginDefOut}}
41 + {{# def._error:_rule }}
42 + {{# def.storeDefOut:__err }}
43 +
44 + {{? !it.compositeRule && $breakOnError }}
45 + {{ 'istanbul ignore if'; }}
46 + {{? it.async }}
47 + throw new ValidationError([{{=__err}}]);
48 + {{??}}
49 + validate.errors = [{{=__err}}];
50 + return false;
51 + {{?}}
52 + {{??}}
53 + var err = {{=__err}};
54 + {{# def._addError:_rule }}
55 + {{?}}
56 +#}}
57 +
58 +
59 +{{## def.extraError:_rule:
60 + {{# def.addError:_rule}}
61 + {{? !it.compositeRule && $breakOnError }}
62 + {{ 'istanbul ignore if'; }}
63 + {{? it.async }}
64 + throw new ValidationError(vErrors);
65 + {{??}}
66 + validate.errors = vErrors;
67 + return false;
68 + {{?}}
69 + {{?}}
70 +#}}
71 +
72 +
73 +{{## def.checkError:_rule:
74 + if (!{{=$valid}}) {
75 + {{# def.error:_rule }}
76 + }
77 +#}}
78 +
79 +
80 +{{## def.resetErrors:
81 + errors = {{=$errs}};
82 + if (vErrors !== null) {
83 + if ({{=$errs}}) vErrors.length = {{=$errs}};
84 + else vErrors = null;
85 + }
86 +#}}
87 +
88 +
89 +{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}}
90 +{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}}
91 +{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}}
92 +
93 +{{## def._errorMessages = {
94 + 'false schema': "'boolean schema is false'",
95 + $ref: "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'",
96 + additionalItems: "'should NOT have more than {{=$schema.length}} items'",
97 + additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'",
98 + anyOf: "'should match some schema in anyOf'",
99 + const: "'should be equal to constant'",
100 + contains: "'should contain a valid item'",
101 + dependencies: "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'",
102 + 'enum': "'should be equal to one of the allowed values'",
103 + format: "'should match format \"{{#def.concatSchemaEQ}}\"'",
104 + 'if': "'should match \"' + {{=$ifClause}} + '\" schema'",
105 + _limit: "'should be {{=$opStr}} {{#def.appendSchema}}",
106 + _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'",
107 + _limitItems: "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'",
108 + _limitLength: "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'",
109 + _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'",
110 + multipleOf: "'should be multiple of {{#def.appendSchema}}",
111 + not: "'should NOT be valid'",
112 + oneOf: "'should match exactly one schema in oneOf'",
113 + pattern: "'should match pattern \"{{#def.concatSchemaEQ}}\"'",
114 + propertyNames: "'property name \\'{{=$invalidName}}\\' is invalid'",
115 + required: "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'",
116 + type: "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'",
117 + uniqueItems: "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'",
118 + custom: "'should pass \"{{=$rule.keyword}}\" keyword validation'",
119 + patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''",
120 + switch: "'should pass \"switch\" keyword validation'",
121 + _formatLimit: "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'",
122 + _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'"
123 +} #}}
124 +
125 +
126 +{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}}
127 +{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}
128 +
129 +{{## def._errorSchemas = {
130 + 'false schema': "false",
131 + $ref: "{{=it.util.toQuotedString($schema)}}",
132 + additionalItems: "false",
133 + additionalProperties: "false",
134 + anyOf: "validate.schema{{=$schemaPath}}",
135 + const: "validate.schema{{=$schemaPath}}",
136 + contains: "validate.schema{{=$schemaPath}}",
137 + dependencies: "validate.schema{{=$schemaPath}}",
138 + 'enum': "validate.schema{{=$schemaPath}}",
139 + format: "{{#def.schemaRefOrQS}}",
140 + 'if': "validate.schema{{=$schemaPath}}",
141 + _limit: "{{#def.schemaRefOrVal}}",
142 + _exclusiveLimit: "validate.schema{{=$schemaPath}}",
143 + _limitItems: "{{#def.schemaRefOrVal}}",
144 + _limitLength: "{{#def.schemaRefOrVal}}",
145 + _limitProperties:"{{#def.schemaRefOrVal}}",
146 + multipleOf: "{{#def.schemaRefOrVal}}",
147 + not: "validate.schema{{=$schemaPath}}",
148 + oneOf: "validate.schema{{=$schemaPath}}",
149 + pattern: "{{#def.schemaRefOrQS}}",
150 + propertyNames: "validate.schema{{=$schemaPath}}",
151 + required: "validate.schema{{=$schemaPath}}",
152 + type: "validate.schema{{=$schemaPath}}",
153 + uniqueItems: "{{#def.schemaRefOrVal}}",
154 + custom: "validate.schema{{=$schemaPath}}",
155 + patternRequired: "validate.schema{{=$schemaPath}}",
156 + switch: "validate.schema{{=$schemaPath}}",
157 + _formatLimit: "{{#def.schemaRefOrQS}}",
158 + _formatExclusiveLimit: "validate.schema{{=$schemaPath}}"
159 +} #}}
160 +
161 +
162 +{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}
163 +
164 +{{## def._errorParams = {
165 + 'false schema': "{}",
166 + $ref: "{ ref: '{{=it.util.escapeQuotes($schema)}}' }",
167 + additionalItems: "{ limit: {{=$schema.length}} }",
168 + additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }",
169 + anyOf: "{}",
170 + const: "{ allowedValue: schema{{=$lvl}} }",
171 + contains: "{}",
172 + dependencies: "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }",
173 + 'enum': "{ allowedValues: schema{{=$lvl}} }",
174 + format: "{ format: {{#def.schemaValueQS}} }",
175 + 'if': "{ failingKeyword: {{=$ifClause}} }",
176 + _limit: "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }",
177 + _exclusiveLimit: "{}",
178 + _limitItems: "{ limit: {{=$schemaValue}} }",
179 + _limitLength: "{ limit: {{=$schemaValue}} }",
180 + _limitProperties:"{ limit: {{=$schemaValue}} }",
181 + multipleOf: "{ multipleOf: {{=$schemaValue}} }",
182 + not: "{}",
183 + oneOf: "{ passingSchemas: {{=$passingSchemas}} }",
184 + pattern: "{ pattern: {{#def.schemaValueQS}} }",
185 + propertyNames: "{ propertyName: '{{=$invalidName}}' }",
186 + required: "{ missingProperty: '{{=$missingProperty}}' }",
187 + type: "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }",
188 + uniqueItems: "{ i: i, j: j }",
189 + custom: "{ keyword: '{{=$rule.keyword}}' }",
190 + patternRequired: "{ missingPattern: '{{=$missingPattern}}' }",
191 + switch: "{ caseIndex: {{=$caseIndex}} }",
192 + _formatLimit: "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }",
193 + _formatExclusiveLimit: "{}"
194 +} #}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +
5 +{{## def.skipFormat:
6 + {{? $breakOnError }} if (true) { {{?}}
7 + {{ return out; }}
8 +#}}
9 +
10 +{{? it.opts.format === false }}{{# def.skipFormat }}{{?}}
11 +
12 +
13 +{{# def.$data }}
14 +
15 +
16 +{{## def.$dataCheckFormat:
17 + {{# def.$dataNotType:'string' }}
18 + ({{? $unknownFormats != 'ignore' }}
19 + ({{=$schemaValue}} && !{{=$format}}
20 + {{? $allowUnknown }}
21 + && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1
22 + {{?}}) ||
23 + {{?}}
24 + ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}'
25 + && !(typeof {{=$format}} == 'function'
26 + ? {{? it.async}}
27 + (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}}))
28 + {{??}}
29 + {{=$format}}({{=$data}})
30 + {{?}}
31 + : {{=$format}}.test({{=$data}}))))
32 +#}}
33 +
34 +{{## def.checkFormat:
35 + {{
36 + var $formatRef = 'formats' + it.util.getProperty($schema);
37 + if ($isObject) $formatRef += '.validate';
38 + }}
39 + {{? typeof $format == 'function' }}
40 + {{=$formatRef}}({{=$data}})
41 + {{??}}
42 + {{=$formatRef}}.test({{=$data}})
43 + {{?}}
44 +#}}
45 +
46 +
47 +{{
48 + var $unknownFormats = it.opts.unknownFormats
49 + , $allowUnknown = Array.isArray($unknownFormats);
50 +}}
51 +
52 +{{? $isData }}
53 + {{
54 + var $format = 'format' + $lvl
55 + , $isObject = 'isObject' + $lvl
56 + , $formatType = 'formatType' + $lvl;
57 + }}
58 + var {{=$format}} = formats[{{=$schemaValue}}];
59 + var {{=$isObject}} = typeof {{=$format}} == 'object'
60 + && !({{=$format}} instanceof RegExp)
61 + && {{=$format}}.validate;
62 + var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string';
63 + if ({{=$isObject}}) {
64 + {{? it.async}}
65 + var async{{=$lvl}} = {{=$format}}.async;
66 + {{?}}
67 + {{=$format}} = {{=$format}}.validate;
68 + }
69 + if ({{# def.$dataCheckFormat }}) {
70 +{{??}}
71 + {{ var $format = it.formats[$schema]; }}
72 + {{? !$format }}
73 + {{? $unknownFormats == 'ignore' }}
74 + {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }}
75 + {{# def.skipFormat }}
76 + {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }}
77 + {{# def.skipFormat }}
78 + {{??}}
79 + {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }}
80 + {{?}}
81 + {{?}}
82 + {{
83 + var $isObject = typeof $format == 'object'
84 + && !($format instanceof RegExp)
85 + && $format.validate;
86 + var $formatType = $isObject && $format.type || 'string';
87 + if ($isObject) {
88 + var $async = $format.async === true;
89 + $format = $format.validate;
90 + }
91 + }}
92 + {{? $formatType != $ruleType }}
93 + {{# def.skipFormat }}
94 + {{?}}
95 + {{? $async }}
96 + {{
97 + if (!it.async) throw new Error('async format in sync schema');
98 + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';
99 + }}
100 + if (!(await {{=$formatRef}}({{=$data}}))) {
101 + {{??}}
102 + if (!{{# def.checkFormat }}) {
103 + {{?}}
104 +{{?}}
105 + {{# def.error:'format' }}
106 + } {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +
7 +{{## def.validateIfClause:_clause:
8 + {{
9 + $it.schema = it.schema['_clause'];
10 + $it.schemaPath = it.schemaPath + '._clause';
11 + $it.errSchemaPath = it.errSchemaPath + '/_clause';
12 + }}
13 + {{# def.insertSubschemaCode }}
14 + {{=$valid}} = {{=$nextValid}};
15 + {{? $thenPresent && $elsePresent }}
16 + {{ $ifClause = 'ifClause' + $lvl; }}
17 + var {{=$ifClause}} = '_clause';
18 + {{??}}
19 + {{ $ifClause = '\'_clause\''; }}
20 + {{?}}
21 +#}}
22 +
23 +{{
24 + var $thenSch = it.schema['then']
25 + , $elseSch = it.schema['else']
26 + , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }}
27 + , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }}
28 + , $currentBaseId = $it.baseId;
29 +}}
30 +
31 +{{? $thenPresent || $elsePresent }}
32 + {{
33 + var $ifClause;
34 + $it.createErrors = false;
35 + $it.schema = $schema;
36 + $it.schemaPath = $schemaPath;
37 + $it.errSchemaPath = $errSchemaPath;
38 + }}
39 + var {{=$errs}} = errors;
40 + var {{=$valid}} = true;
41 +
42 + {{# def.setCompositeRule }}
43 + {{# def.insertSubschemaCode }}
44 + {{ $it.createErrors = true; }}
45 + {{# def.resetErrors }}
46 + {{# def.resetCompositeRule }}
47 +
48 + {{? $thenPresent }}
49 + if ({{=$nextValid}}) {
50 + {{# def.validateIfClause:then }}
51 + }
52 + {{? $elsePresent }}
53 + else {
54 + {{?}}
55 + {{??}}
56 + if (!{{=$nextValid}}) {
57 + {{?}}
58 +
59 + {{? $elsePresent }}
60 + {{# def.validateIfClause:else }}
61 + }
62 + {{?}}
63 +
64 + if (!{{=$valid}}) {
65 + {{# def.extraError:'if' }}
66 + }
67 + {{? $breakOnError }} else { {{?}}
68 +{{??}}
69 + {{? $breakOnError }}
70 + if (true) {
71 + {{?}}
72 +{{?}}
73 +
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +
7 +{{## def.validateItems:startFrom:
8 + for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) {
9 + {{
10 + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
11 + var $passData = $data + '[' + $idx + ']';
12 + $it.dataPathArr[$dataNxt] = $idx;
13 + }}
14 +
15 + {{# def.generateSubschemaCode }}
16 + {{# def.optimizeValidate }}
17 +
18 + {{? $breakOnError }}
19 + if (!{{=$nextValid}}) break;
20 + {{?}}
21 + }
22 +#}}
23 +
24 +{{
25 + var $idx = 'i' + $lvl
26 + , $dataNxt = $it.dataLevel = it.dataLevel + 1
27 + , $nextData = 'data' + $dataNxt
28 + , $currentBaseId = it.baseId;
29 +}}
30 +
31 +var {{=$errs}} = errors;
32 +var {{=$valid}};
33 +
34 +{{? Array.isArray($schema) }}
35 + {{ /* 'items' is an array of schemas */}}
36 + {{ var $additionalItems = it.schema.additionalItems; }}
37 + {{? $additionalItems === false }}
38 + {{=$valid}} = {{=$data}}.length <= {{= $schema.length }};
39 + {{
40 + var $currErrSchemaPath = $errSchemaPath;
41 + $errSchemaPath = it.errSchemaPath + '/additionalItems';
42 + }}
43 + {{# def.checkError:'additionalItems' }}
44 + {{ $errSchemaPath = $currErrSchemaPath; }}
45 + {{# def.elseIfValid}}
46 + {{?}}
47 +
48 + {{~ $schema:$sch:$i }}
49 + {{? {{# def.nonEmptySchema:$sch }} }}
50 + {{=$nextValid}} = true;
51 +
52 + if ({{=$data}}.length > {{=$i}}) {
53 + {{
54 + var $passData = $data + '[' + $i + ']';
55 + $it.schema = $sch;
56 + $it.schemaPath = $schemaPath + '[' + $i + ']';
57 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
58 + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
59 + $it.dataPathArr[$dataNxt] = $i;
60 + }}
61 +
62 + {{# def.generateSubschemaCode }}
63 + {{# def.optimizeValidate }}
64 + }
65 +
66 + {{# def.ifResultValid }}
67 + {{?}}
68 + {{~}}
69 +
70 + {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }}
71 + {{
72 + $it.schema = $additionalItems;
73 + $it.schemaPath = it.schemaPath + '.additionalItems';
74 + $it.errSchemaPath = it.errSchemaPath + '/additionalItems';
75 + }}
76 + {{=$nextValid}} = true;
77 +
78 + if ({{=$data}}.length > {{= $schema.length }}) {
79 + {{# def.validateItems: $schema.length }}
80 + }
81 +
82 + {{# def.ifResultValid }}
83 + {{?}}
84 +
85 +{{?? {{# def.nonEmptySchema:$schema }} }}
86 + {{ /* 'items' is a single schema */}}
87 + {{
88 + $it.schema = $schema;
89 + $it.schemaPath = $schemaPath;
90 + $it.errSchemaPath = $errSchemaPath;
91 + }}
92 + {{# def.validateItems: 0 }}
93 +{{?}}
94 +
95 +{{? $breakOnError }}
96 + {{= $closingBraces }}
97 + if ({{=$errs}} == errors) {
98 +{{?}}
1 +{{## def.checkMissingProperty:_properties:
2 + {{~ _properties:$propertyKey:$i }}
3 + {{?$i}} || {{?}}
4 + {{
5 + var $prop = it.util.getProperty($propertyKey)
6 + , $useData = $data + $prop;
7 + }}
8 + ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) )
9 + {{~}}
10 +#}}
11 +
12 +
13 +{{## def.errorMissingProperty:_error:
14 + {{
15 + var $propertyPath = 'missing' + $lvl
16 + , $missingProperty = '\' + ' + $propertyPath + ' + \'';
17 + if (it.opts._errorDataPathProperty) {
18 + it.errorPath = it.opts.jsonPointers
19 + ? it.util.getPathExpr($currentErrorPath, $propertyPath, true)
20 + : $currentErrorPath + ' + ' + $propertyPath;
21 + }
22 + }}
23 + {{# def.error:_error }}
24 +#}}
25 +
26 +
27 +{{## def.allErrorsMissingProperty:_error:
28 + {{
29 + var $prop = it.util.getProperty($propertyKey)
30 + , $missingProperty = it.util.escapeQuotes($propertyKey)
31 + , $useData = $data + $prop;
32 + if (it.opts._errorDataPathProperty) {
33 + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
34 + }
35 + }}
36 + if ({{# def.noPropertyInData }}) {
37 + {{# def.addError:_error }}
38 + }
39 +#}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{# def.numberKeyword }}
7 +
8 +var division{{=$lvl}};
9 +if ({{?$isData}}
10 + {{=$schemaValue}} !== undefined && (
11 + typeof {{=$schemaValue}} != 'number' ||
12 + {{?}}
13 + (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}},
14 + {{? it.opts.multipleOfPrecision }}
15 + Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}}
16 + {{??}}
17 + division{{=$lvl}} !== parseInt(division{{=$lvl}})
18 + {{?}}
19 + )
20 + {{?$isData}} ) {{?}} ) {
21 + {{# def.error:'multipleOf' }}
22 +} {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +{{? {{# def.nonEmptySchema:$schema }} }}
7 + {{
8 + $it.schema = $schema;
9 + $it.schemaPath = $schemaPath;
10 + $it.errSchemaPath = $errSchemaPath;
11 + }}
12 +
13 + var {{=$errs}} = errors;
14 +
15 + {{# def.setCompositeRule }}
16 +
17 + {{
18 + $it.createErrors = false;
19 + var $allErrorsOption;
20 + if ($it.opts.allErrors) {
21 + $allErrorsOption = $it.opts.allErrors;
22 + $it.opts.allErrors = false;
23 + }
24 + }}
25 + {{= it.validate($it) }}
26 + {{
27 + $it.createErrors = true;
28 + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;
29 + }}
30 +
31 + {{# def.resetCompositeRule }}
32 +
33 + if ({{=$nextValid}}) {
34 + {{# def.error:'not' }}
35 + } else {
36 + {{# def.resetErrors }}
37 + {{? it.opts.allErrors }} } {{?}}
38 +{{??}}
39 + {{# def.addError:'not' }}
40 + {{? $breakOnError}}
41 + if (false) {
42 + {{?}}
43 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +{{
7 + var $currentBaseId = $it.baseId
8 + , $prevValid = 'prevValid' + $lvl
9 + , $passingSchemas = 'passingSchemas' + $lvl;
10 +}}
11 +
12 +var {{=$errs}} = errors
13 + , {{=$prevValid}} = false
14 + , {{=$valid}} = false
15 + , {{=$passingSchemas}} = null;
16 +
17 +{{# def.setCompositeRule }}
18 +
19 +{{~ $schema:$sch:$i }}
20 + {{? {{# def.nonEmptySchema:$sch }} }}
21 + {{
22 + $it.schema = $sch;
23 + $it.schemaPath = $schemaPath + '[' + $i + ']';
24 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
25 + }}
26 +
27 + {{# def.insertSubschemaCode }}
28 + {{??}}
29 + var {{=$nextValid}} = true;
30 + {{?}}
31 +
32 + {{? $i }}
33 + if ({{=$nextValid}} && {{=$prevValid}}) {
34 + {{=$valid}} = false;
35 + {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}];
36 + } else {
37 + {{ $closingBraces += '}'; }}
38 + {{?}}
39 +
40 + if ({{=$nextValid}}) {
41 + {{=$valid}} = {{=$prevValid}} = true;
42 + {{=$passingSchemas}} = {{=$i}};
43 + }
44 +{{~}}
45 +
46 +{{# def.resetCompositeRule }}
47 +
48 +{{= $closingBraces }}
49 +
50 +if (!{{=$valid}}) {
51 + {{# def.extraError:'oneOf' }}
52 +} else {
53 + {{# def.resetErrors }}
54 +{{? it.opts.allErrors }} } {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +{{
7 + var $regexp = $isData
8 + ? '(new RegExp(' + $schemaValue + '))'
9 + : it.usePattern($schema);
10 +}}
11 +
12 +if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) {
13 + {{# def.error:'pattern' }}
14 +} {{? $breakOnError }} else { {{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +
7 +{{## def.validateAdditional:
8 + {{ /* additionalProperties is schema */
9 + $it.schema = $aProperties;
10 + $it.schemaPath = it.schemaPath + '.additionalProperties';
11 + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';
12 + $it.errorPath = it.opts._errorDataPathProperty
13 + ? it.errorPath
14 + : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
15 + var $passData = $data + '[' + $key + ']';
16 + $it.dataPathArr[$dataNxt] = $key;
17 + }}
18 +
19 + {{# def.generateSubschemaCode }}
20 + {{# def.optimizeValidate }}
21 +#}}
22 +
23 +
24 +{{
25 + var $key = 'key' + $lvl
26 + , $idx = 'idx' + $lvl
27 + , $dataNxt = $it.dataLevel = it.dataLevel + 1
28 + , $nextData = 'data' + $dataNxt
29 + , $dataProperties = 'dataProperties' + $lvl;
30 +
31 + var $schemaKeys = Object.keys($schema || {}).filter(notProto)
32 + , $pProperties = it.schema.patternProperties || {}
33 + , $pPropertyKeys = Object.keys($pProperties).filter(notProto)
34 + , $aProperties = it.schema.additionalProperties
35 + , $someProperties = $schemaKeys.length || $pPropertyKeys.length
36 + , $noAdditional = $aProperties === false
37 + , $additionalIsSchema = typeof $aProperties == 'object'
38 + && Object.keys($aProperties).length
39 + , $removeAdditional = it.opts.removeAdditional
40 + , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional
41 + , $ownProperties = it.opts.ownProperties
42 + , $currentBaseId = it.baseId;
43 +
44 + var $required = it.schema.required;
45 + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
46 + var $requiredHash = it.util.toHash($required);
47 + }
48 +
49 + function notProto(p) { return p !== '__proto__'; }
50 +}}
51 +
52 +
53 +var {{=$errs}} = errors;
54 +var {{=$nextValid}} = true;
55 +{{? $ownProperties }}
56 + var {{=$dataProperties}} = undefined;
57 +{{?}}
58 +
59 +{{? $checkAdditional }}
60 + {{# def.iterateProperties }}
61 + {{? $someProperties }}
62 + var isAdditional{{=$lvl}} = !(false
63 + {{? $schemaKeys.length }}
64 + {{? $schemaKeys.length > 8 }}
65 + || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}})
66 + {{??}}
67 + {{~ $schemaKeys:$propertyKey }}
68 + || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }}
69 + {{~}}
70 + {{?}}
71 + {{?}}
72 + {{? $pPropertyKeys.length }}
73 + {{~ $pPropertyKeys:$pProperty:$i }}
74 + || {{= it.usePattern($pProperty) }}.test({{=$key}})
75 + {{~}}
76 + {{?}}
77 + );
78 +
79 + if (isAdditional{{=$lvl}}) {
80 + {{?}}
81 + {{? $removeAdditional == 'all' }}
82 + delete {{=$data}}[{{=$key}}];
83 + {{??}}
84 + {{
85 + var $currentErrorPath = it.errorPath;
86 + var $additionalProperty = '\' + ' + $key + ' + \'';
87 + if (it.opts._errorDataPathProperty) {
88 + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
89 + }
90 + }}
91 + {{? $noAdditional }}
92 + {{? $removeAdditional }}
93 + delete {{=$data}}[{{=$key}}];
94 + {{??}}
95 + {{=$nextValid}} = false;
96 + {{
97 + var $currErrSchemaPath = $errSchemaPath;
98 + $errSchemaPath = it.errSchemaPath + '/additionalProperties';
99 + }}
100 + {{# def.error:'additionalProperties' }}
101 + {{ $errSchemaPath = $currErrSchemaPath; }}
102 + {{? $breakOnError }} break; {{?}}
103 + {{?}}
104 + {{?? $additionalIsSchema }}
105 + {{? $removeAdditional == 'failing' }}
106 + var {{=$errs}} = errors;
107 + {{# def.setCompositeRule }}
108 +
109 + {{# def.validateAdditional }}
110 +
111 + if (!{{=$nextValid}}) {
112 + errors = {{=$errs}};
113 + if (validate.errors !== null) {
114 + if (errors) validate.errors.length = errors;
115 + else validate.errors = null;
116 + }
117 + delete {{=$data}}[{{=$key}}];
118 + }
119 +
120 + {{# def.resetCompositeRule }}
121 + {{??}}
122 + {{# def.validateAdditional }}
123 + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
124 + {{?}}
125 + {{?}}
126 + {{ it.errorPath = $currentErrorPath; }}
127 + {{?}}
128 + {{? $someProperties }}
129 + }
130 + {{?}}
131 + }
132 +
133 + {{# def.ifResultValid }}
134 +{{?}}
135 +
136 +{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }}
137 +
138 +{{? $schemaKeys.length }}
139 + {{~ $schemaKeys:$propertyKey }}
140 + {{ var $sch = $schema[$propertyKey]; }}
141 +
142 + {{? {{# def.nonEmptySchema:$sch}} }}
143 + {{
144 + var $prop = it.util.getProperty($propertyKey)
145 + , $passData = $data + $prop
146 + , $hasDefault = $useDefaults && $sch.default !== undefined;
147 + $it.schema = $sch;
148 + $it.schemaPath = $schemaPath + $prop;
149 + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);
150 + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
151 + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
152 + }}
153 +
154 + {{# def.generateSubschemaCode }}
155 +
156 + {{? {{# def.willOptimize }} }}
157 + {{
158 + $code = {{# def._optimizeValidate }};
159 + var $useData = $passData;
160 + }}
161 + {{??}}
162 + {{ var $useData = $nextData; }}
163 + var {{=$nextData}} = {{=$passData}};
164 + {{?}}
165 +
166 + {{? $hasDefault }}
167 + {{= $code }}
168 + {{??}}
169 + {{? $requiredHash && $requiredHash[$propertyKey] }}
170 + if ({{# def.noPropertyInData }}) {
171 + {{=$nextValid}} = false;
172 + {{
173 + var $currentErrorPath = it.errorPath
174 + , $currErrSchemaPath = $errSchemaPath
175 + , $missingProperty = it.util.escapeQuotes($propertyKey);
176 + if (it.opts._errorDataPathProperty) {
177 + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
178 + }
179 + $errSchemaPath = it.errSchemaPath + '/required';
180 + }}
181 + {{# def.error:'required' }}
182 + {{ $errSchemaPath = $currErrSchemaPath; }}
183 + {{ it.errorPath = $currentErrorPath; }}
184 + } else {
185 + {{??}}
186 + {{? $breakOnError }}
187 + if ({{# def.noPropertyInData }}) {
188 + {{=$nextValid}} = true;
189 + } else {
190 + {{??}}
191 + if ({{=$useData}} !== undefined
192 + {{? $ownProperties }}
193 + && {{# def.isOwnProperty }}
194 + {{?}}
195 + ) {
196 + {{?}}
197 + {{?}}
198 +
199 + {{= $code }}
200 + }
201 + {{?}} {{ /* $hasDefault */ }}
202 + {{?}} {{ /* def.nonEmptySchema */ }}
203 +
204 + {{# def.ifResultValid }}
205 + {{~}}
206 +{{?}}
207 +
208 +{{? $pPropertyKeys.length }}
209 + {{~ $pPropertyKeys:$pProperty }}
210 + {{ var $sch = $pProperties[$pProperty]; }}
211 +
212 + {{? {{# def.nonEmptySchema:$sch}} }}
213 + {{
214 + $it.schema = $sch;
215 + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);
216 + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/'
217 + + it.util.escapeFragment($pProperty);
218 + }}
219 +
220 + {{# def.iterateProperties }}
221 + if ({{= it.usePattern($pProperty) }}.test({{=$key}})) {
222 + {{
223 + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
224 + var $passData = $data + '[' + $key + ']';
225 + $it.dataPathArr[$dataNxt] = $key;
226 + }}
227 +
228 + {{# def.generateSubschemaCode }}
229 + {{# def.optimizeValidate }}
230 +
231 + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}}
232 + }
233 + {{? $breakOnError }} else {{=$nextValid}} = true; {{?}}
234 + }
235 +
236 + {{# def.ifResultValid }}
237 + {{?}} {{ /* def.nonEmptySchema */ }}
238 + {{~}}
239 +{{?}}
240 +
241 +
242 +{{? $breakOnError }}
243 + {{= $closingBraces }}
244 + if ({{=$errs}} == errors) {
245 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.setupNextLevel }}
5 +
6 +var {{=$errs}} = errors;
7 +
8 +{{? {{# def.nonEmptySchema:$schema }} }}
9 + {{
10 + $it.schema = $schema;
11 + $it.schemaPath = $schemaPath;
12 + $it.errSchemaPath = $errSchemaPath;
13 + }}
14 +
15 + {{
16 + var $key = 'key' + $lvl
17 + , $idx = 'idx' + $lvl
18 + , $i = 'i' + $lvl
19 + , $invalidName = '\' + ' + $key + ' + \''
20 + , $dataNxt = $it.dataLevel = it.dataLevel + 1
21 + , $nextData = 'data' + $dataNxt
22 + , $dataProperties = 'dataProperties' + $lvl
23 + , $ownProperties = it.opts.ownProperties
24 + , $currentBaseId = it.baseId;
25 + }}
26 +
27 + {{? $ownProperties }}
28 + var {{=$dataProperties}} = undefined;
29 + {{?}}
30 + {{# def.iterateProperties }}
31 + var startErrs{{=$lvl}} = errors;
32 +
33 + {{ var $passData = $key; }}
34 + {{# def.setCompositeRule }}
35 + {{# def.generateSubschemaCode }}
36 + {{# def.optimizeValidate }}
37 + {{# def.resetCompositeRule }}
38 +
39 + if (!{{=$nextValid}}) {
40 + for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}<errors; {{=$i}}++) {
41 + vErrors[{{=$i}}].propertyName = {{=$key}};
42 + }
43 + {{# def.extraError:'propertyNames' }}
44 + {{? $breakOnError }} break; {{?}}
45 + }
46 + }
47 +{{?}}
48 +
49 +{{? $breakOnError }}
50 + {{= $closingBraces }}
51 + if ({{=$errs}} == errors) {
52 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +
5 +{{## def._validateRef:_v:
6 + {{? it.opts.passContext }}
7 + {{=_v}}.call(this,
8 + {{??}}
9 + {{=_v}}(
10 + {{?}}
11 + {{=$data}}, {{# def.dataPath }}{{# def.passParentData }}, rootData)
12 +#}}
13 +
14 +{{ var $async, $refCode; }}
15 +{{? $schema == '#' || $schema == '#/' }}
16 + {{
17 + if (it.isRoot) {
18 + $async = it.async;
19 + $refCode = 'validate';
20 + } else {
21 + $async = it.root.schema.$async === true;
22 + $refCode = 'root.refVal[0]';
23 + }
24 + }}
25 +{{??}}
26 + {{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}
27 + {{? $refVal === undefined }}
28 + {{ var $message = it.MissingRefError.message(it.baseId, $schema); }}
29 + {{? it.opts.missingRefs == 'fail' }}
30 + {{ it.logger.error($message); }}
31 + {{# def.error:'$ref' }}
32 + {{? $breakOnError }} if (false) { {{?}}
33 + {{?? it.opts.missingRefs == 'ignore' }}
34 + {{ it.logger.warn($message); }}
35 + {{? $breakOnError }} if (true) { {{?}}
36 + {{??}}
37 + {{ throw new it.MissingRefError(it.baseId, $schema, $message); }}
38 + {{?}}
39 + {{?? $refVal.inline }}
40 + {{# def.setupNextLevel }}
41 + {{
42 + $it.schema = $refVal.schema;
43 + $it.schemaPath = '';
44 + $it.errSchemaPath = $schema;
45 + }}
46 + {{ var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code); }}
47 + {{= $code }}
48 + {{? $breakOnError}}
49 + if ({{=$nextValid}}) {
50 + {{?}}
51 + {{??}}
52 + {{
53 + $async = $refVal.$async === true || (it.async && $refVal.$async !== false);
54 + $refCode = $refVal.code;
55 + }}
56 + {{?}}
57 +{{?}}
58 +
59 +{{? $refCode }}
60 + {{# def.beginDefOut}}
61 + {{# def._validateRef:$refCode }}
62 + {{# def.storeDefOut:__callValidate }}
63 +
64 + {{? $async }}
65 + {{ if (!it.async) throw new Error('async schema referenced by sync schema'); }}
66 + {{? $breakOnError }} var {{=$valid}}; {{?}}
67 + try {
68 + await {{=__callValidate}};
69 + {{? $breakOnError }} {{=$valid}} = true; {{?}}
70 + } catch (e) {
71 + if (!(e instanceof ValidationError)) throw e;
72 + if (vErrors === null) vErrors = e.errors;
73 + else vErrors = vErrors.concat(e.errors);
74 + errors = vErrors.length;
75 + {{? $breakOnError }} {{=$valid}} = false; {{?}}
76 + }
77 + {{? $breakOnError }} if ({{=$valid}}) { {{?}}
78 + {{??}}
79 + if (!{{=__callValidate}}) {
80 + if (vErrors === null) vErrors = {{=$refCode}}.errors;
81 + else vErrors = vErrors.concat({{=$refCode}}.errors);
82 + errors = vErrors.length;
83 + } {{? $breakOnError }} else { {{?}}
84 + {{?}}
85 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.missing }}
4 +{{# def.setupKeyword }}
5 +{{# def.$data }}
6 +
7 +{{ var $vSchema = 'schema' + $lvl; }}
8 +
9 +{{## def.setupLoop:
10 + {{? !$isData }}
11 + var {{=$vSchema}} = validate.schema{{=$schemaPath}};
12 + {{?}}
13 +
14 + {{
15 + var $i = 'i' + $lvl
16 + , $propertyPath = 'schema' + $lvl + '[' + $i + ']'
17 + , $missingProperty = '\' + ' + $propertyPath + ' + \'';
18 + if (it.opts._errorDataPathProperty) {
19 + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
20 + }
21 + }}
22 +#}}
23 +
24 +
25 +{{## def.isRequiredOwnProperty:
26 + Object.prototype.hasOwnProperty.call({{=$data}}, {{=$vSchema}}[{{=$i}}])
27 +#}}
28 +
29 +
30 +{{? !$isData }}
31 + {{? $schema.length < it.opts.loopRequired &&
32 + it.schema.properties && Object.keys(it.schema.properties).length }}
33 + {{ var $required = []; }}
34 + {{~ $schema:$property }}
35 + {{ var $propertySch = it.schema.properties[$property]; }}
36 + {{? !($propertySch && {{# def.nonEmptySchema:$propertySch}}) }}
37 + {{ $required[$required.length] = $property; }}
38 + {{?}}
39 + {{~}}
40 + {{??}}
41 + {{ var $required = $schema; }}
42 + {{?}}
43 +{{?}}
44 +
45 +
46 +{{? $isData || $required.length }}
47 + {{
48 + var $currentErrorPath = it.errorPath
49 + , $loopRequired = $isData || $required.length >= it.opts.loopRequired
50 + , $ownProperties = it.opts.ownProperties;
51 + }}
52 +
53 + {{? $breakOnError }}
54 + var missing{{=$lvl}};
55 + {{? $loopRequired }}
56 + {{# def.setupLoop }}
57 + var {{=$valid}} = true;
58 +
59 + {{?$isData}}{{# def.check$dataIsArray }}{{?}}
60 +
61 + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
62 + {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined
63 + {{? $ownProperties }}
64 + && {{# def.isRequiredOwnProperty }}
65 + {{?}};
66 + if (!{{=$valid}}) break;
67 + }
68 +
69 + {{? $isData }} } {{?}}
70 +
71 + {{# def.checkError:'required' }}
72 + else {
73 + {{??}}
74 + if ({{# def.checkMissingProperty:$required }}) {
75 + {{# def.errorMissingProperty:'required' }}
76 + } else {
77 + {{?}}
78 + {{??}}
79 + {{? $loopRequired }}
80 + {{# def.setupLoop }}
81 + {{? $isData }}
82 + if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) {
83 + {{# def.addError:'required' }}
84 + } else if ({{=$vSchema}} !== undefined) {
85 + {{?}}
86 +
87 + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) {
88 + if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined
89 + {{? $ownProperties }}
90 + || !{{# def.isRequiredOwnProperty }}
91 + {{?}}) {
92 + {{# def.addError:'required' }}
93 + }
94 + }
95 +
96 + {{? $isData }} } {{?}}
97 + {{??}}
98 + {{~ $required:$propertyKey }}
99 + {{# def.allErrorsMissingProperty:'required' }}
100 + {{~}}
101 + {{?}}
102 + {{?}}
103 +
104 + {{ it.errorPath = $currentErrorPath; }}
105 +
106 +{{?? $breakOnError }}
107 + if (true) {
108 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.setupKeyword }}
4 +{{# def.$data }}
5 +
6 +
7 +{{? ($schema || $isData) && it.opts.uniqueItems !== false }}
8 + {{? $isData }}
9 + var {{=$valid}};
10 + if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined)
11 + {{=$valid}} = true;
12 + else if (typeof {{=$schemaValue}} != 'boolean')
13 + {{=$valid}} = false;
14 + else {
15 + {{?}}
16 +
17 + var i = {{=$data}}.length
18 + , {{=$valid}} = true
19 + , j;
20 + if (i > 1) {
21 + {{
22 + var $itemType = it.schema.items && it.schema.items.type
23 + , $typeIsArray = Array.isArray($itemType);
24 + }}
25 + {{? !$itemType || $itemType == 'object' || $itemType == 'array' ||
26 + ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }}
27 + outer:
28 + for (;i--;) {
29 + for (j = i; j--;) {
30 + if (equal({{=$data}}[i], {{=$data}}[j])) {
31 + {{=$valid}} = false;
32 + break outer;
33 + }
34 + }
35 + }
36 + {{??}}
37 + var itemIndices = {}, item;
38 + for (;i--;) {
39 + var item = {{=$data}}[i];
40 + {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }}
41 + if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue;
42 + {{? $typeIsArray}}
43 + if (typeof item == 'string') item = '"' + item;
44 + {{?}}
45 + if (typeof itemIndices[item] == 'number') {
46 + {{=$valid}} = false;
47 + j = itemIndices[item];
48 + break;
49 + }
50 + itemIndices[item] = i;
51 + }
52 + {{?}}
53 + }
54 +
55 + {{? $isData }} } {{?}}
56 +
57 + if (!{{=$valid}}) {
58 + {{# def.error:'uniqueItems' }}
59 + } {{? $breakOnError }} else { {{?}}
60 +{{??}}
61 + {{? $breakOnError }} if (true) { {{?}}
62 +{{?}}
1 +{{# def.definitions }}
2 +{{# def.errors }}
3 +{{# def.defaults }}
4 +{{# def.coerce }}
5 +
6 +{{ /**
7 + * schema compilation (render) time:
8 + * it = { schema, RULES, _validate, opts }
9 + * it.validate - this template function,
10 + * it is used recursively to generate code for subschemas
11 + *
12 + * runtime:
13 + * "validate" is a variable name to which this function will be assigned
14 + * validateRef etc. are defined in the parent scope in index.js
15 + */ }}
16 +
17 +{{
18 + var $async = it.schema.$async === true
19 + , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref')
20 + , $id = it.self._getId(it.schema);
21 +}}
22 +
23 +{{
24 + if (it.opts.strictKeywords) {
25 + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
26 + if ($unknownKwd) {
27 + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;
28 + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);
29 + else throw new Error($keywordsMsg);
30 + }
31 + }
32 +}}
33 +
34 +{{? it.isTop }}
35 + var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) {
36 + 'use strict';
37 + {{? $id && (it.opts.sourceCode || it.opts.processCode) }}
38 + {{= '/\*# sourceURL=' + $id + ' */' }}
39 + {{?}}
40 +{{?}}
41 +
42 +{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }}
43 + {{ var $keyword = 'false schema'; }}
44 + {{# def.setupKeyword }}
45 + {{? it.schema === false}}
46 + {{? it.isTop}}
47 + {{ $breakOnError = true; }}
48 + {{??}}
49 + var {{=$valid}} = false;
50 + {{?}}
51 + {{# def.error:'false schema' }}
52 + {{??}}
53 + {{? it.isTop}}
54 + {{? $async }}
55 + return data;
56 + {{??}}
57 + validate.errors = null;
58 + return true;
59 + {{?}}
60 + {{??}}
61 + var {{=$valid}} = true;
62 + {{?}}
63 + {{?}}
64 +
65 + {{? it.isTop}}
66 + };
67 + return validate;
68 + {{?}}
69 +
70 + {{ return out; }}
71 +{{?}}
72 +
73 +
74 +{{? it.isTop }}
75 + {{
76 + var $top = it.isTop
77 + , $lvl = it.level = 0
78 + , $dataLvl = it.dataLevel = 0
79 + , $data = 'data';
80 + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
81 + it.baseId = it.baseId || it.rootId;
82 + delete it.isTop;
83 +
84 + it.dataPathArr = [""];
85 +
86 + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {
87 + var $defaultMsg = 'default is ignored in the schema root';
88 + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);
89 + else throw new Error($defaultMsg);
90 + }
91 + }}
92 +
93 + var vErrors = null; {{ /* don't edit, used in replace */ }}
94 + var errors = 0; {{ /* don't edit, used in replace */ }}
95 + if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }}
96 +{{??}}
97 + {{
98 + var $lvl = it.level
99 + , $dataLvl = it.dataLevel
100 + , $data = 'data' + ($dataLvl || '');
101 +
102 + if ($id) it.baseId = it.resolve.url(it.baseId, $id);
103 +
104 + if ($async && !it.async) throw new Error('async schema in sync schema');
105 + }}
106 +
107 + var errs_{{=$lvl}} = errors;
108 +{{?}}
109 +
110 +{{
111 + var $valid = 'valid' + $lvl
112 + , $breakOnError = !it.opts.allErrors
113 + , $closingBraces1 = ''
114 + , $closingBraces2 = '';
115 +
116 + var $errorKeyword;
117 + var $typeSchema = it.schema.type
118 + , $typeIsArray = Array.isArray($typeSchema);
119 +
120 + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
121 + if ($typeIsArray) {
122 + if ($typeSchema.indexOf('null') == -1)
123 + $typeSchema = $typeSchema.concat('null');
124 + } else if ($typeSchema != 'null') {
125 + $typeSchema = [$typeSchema, 'null'];
126 + $typeIsArray = true;
127 + }
128 + }
129 +
130 + if ($typeIsArray && $typeSchema.length == 1) {
131 + $typeSchema = $typeSchema[0];
132 + $typeIsArray = false;
133 + }
134 +}}
135 +
136 +{{## def.checkType:
137 + {{
138 + var $schemaPath = it.schemaPath + '.type'
139 + , $errSchemaPath = it.errSchemaPath + '/type'
140 + , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';
141 + }}
142 +
143 + if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) {
144 +#}}
145 +
146 +{{? it.schema.$ref && $refKeywords }}
147 + {{? it.opts.extendRefs == 'fail' }}
148 + {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }}
149 + {{?? it.opts.extendRefs !== true }}
150 + {{
151 + $refKeywords = false;
152 + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
153 + }}
154 + {{?}}
155 +{{?}}
156 +
157 +{{? it.schema.$comment && it.opts.$comment }}
158 + {{= it.RULES.all.$comment.code(it, '$comment') }}
159 +{{?}}
160 +
161 +{{? $typeSchema }}
162 + {{? it.opts.coerceTypes }}
163 + {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }}
164 + {{?}}
165 +
166 + {{ var $rulesGroup = it.RULES.types[$typeSchema]; }}
167 + {{? $coerceToTypes || $typeIsArray || $rulesGroup === true ||
168 + ($rulesGroup && !$shouldUseGroup($rulesGroup)) }}
169 + {{
170 + var $schemaPath = it.schemaPath + '.type'
171 + , $errSchemaPath = it.errSchemaPath + '/type';
172 + }}
173 + {{# def.checkType }}
174 + {{? $coerceToTypes }}
175 + {{# def.coerceType }}
176 + {{??}}
177 + {{# def.error:'type' }}
178 + {{?}}
179 + }
180 + {{?}}
181 +{{?}}
182 +
183 +
184 +{{? it.schema.$ref && !$refKeywords }}
185 + {{= it.RULES.all.$ref.code(it, '$ref') }}
186 + {{? $breakOnError }}
187 + }
188 + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
189 + {{ $closingBraces2 += '}'; }}
190 + {{?}}
191 +{{??}}
192 + {{~ it.RULES:$rulesGroup }}
193 + {{? $shouldUseGroup($rulesGroup) }}
194 + {{? $rulesGroup.type }}
195 + if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) {
196 + {{?}}
197 + {{? it.opts.useDefaults }}
198 + {{? $rulesGroup.type == 'object' && it.schema.properties }}
199 + {{# def.defaultProperties }}
200 + {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }}
201 + {{# def.defaultItems }}
202 + {{?}}
203 + {{?}}
204 + {{~ $rulesGroup.rules:$rule }}
205 + {{? $shouldUseRule($rule) }}
206 + {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }}
207 + {{? $code }}
208 + {{= $code }}
209 + {{? $breakOnError }}
210 + {{ $closingBraces1 += '}'; }}
211 + {{?}}
212 + {{?}}
213 + {{?}}
214 + {{~}}
215 + {{? $breakOnError }}
216 + {{= $closingBraces1 }}
217 + {{ $closingBraces1 = ''; }}
218 + {{?}}
219 + {{? $rulesGroup.type }}
220 + }
221 + {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }}
222 + else {
223 + {{
224 + var $schemaPath = it.schemaPath + '.type'
225 + , $errSchemaPath = it.errSchemaPath + '/type';
226 + }}
227 + {{# def.error:'type' }}
228 + }
229 + {{?}}
230 + {{?}}
231 +
232 + {{? $breakOnError }}
233 + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) {
234 + {{ $closingBraces2 += '}'; }}
235 + {{?}}
236 + {{?}}
237 + {{~}}
238 +{{?}}
239 +
240 +{{? $breakOnError }} {{= $closingBraces2 }} {{?}}
241 +
242 +{{? $top }}
243 + {{? $async }}
244 + if (errors === 0) return data; {{ /* don't edit, used in replace */ }}
245 + else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }}
246 + {{??}}
247 + validate.errors = vErrors; {{ /* don't edit, used in replace */ }}
248 + return errors === 0; {{ /* don't edit, used in replace */ }}
249 + {{?}}
250 + };
251 +
252 + return validate;
253 +{{??}}
254 + var {{=$valid}} = errors === errs_{{=$lvl}};
255 +{{?}}
256 +
257 +{{
258 + function $shouldUseGroup($rulesGroup) {
259 + var rules = $rulesGroup.rules;
260 + for (var i=0; i < rules.length; i++)
261 + if ($shouldUseRule(rules[i]))
262 + return true;
263 + }
264 +
265 + function $shouldUseRule($rule) {
266 + return it.schema[$rule.keyword] !== undefined ||
267 + ($rule.implements && $ruleImplementsSomeKeyword($rule));
268 + }
269 +
270 + function $ruleImplementsSomeKeyword($rule) {
271 + var impl = $rule.implements;
272 + for (var i=0; i < impl.length; i++)
273 + if (it.schema[impl[i]] !== undefined)
274 + return true;
275 + }
276 +}}
1 +These files are compiled dot templates from dot folder.
2 +
3 +Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder.
1 +'use strict';
2 +module.exports = function generate__limit(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $errorKeyword;
11 + var $data = 'data' + ($dataLvl || '');
12 + var $isData = it.opts.$data && $schema && $schema.$data,
13 + $schemaValue;
14 + if ($isData) {
15 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
16 + $schemaValue = 'schema' + $lvl;
17 + } else {
18 + $schemaValue = $schema;
19 + }
20 + var $isMax = $keyword == 'maximum',
21 + $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',
22 + $schemaExcl = it.schema[$exclusiveKeyword],
23 + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,
24 + $op = $isMax ? '<' : '>',
25 + $notOp = $isMax ? '>' : '<',
26 + $errorKeyword = undefined;
27 + if (!($isData || typeof $schema == 'number' || $schema === undefined)) {
28 + throw new Error($keyword + ' must be number');
29 + }
30 + if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {
31 + throw new Error($exclusiveKeyword + ' must be number or boolean');
32 + }
33 + if ($isDataExcl) {
34 + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),
35 + $exclusive = 'exclusive' + $lvl,
36 + $exclType = 'exclType' + $lvl,
37 + $exclIsNumber = 'exclIsNumber' + $lvl,
38 + $opExpr = 'op' + $lvl,
39 + $opStr = '\' + ' + $opExpr + ' + \'';
40 + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';
41 + $schemaValueExcl = 'schemaExcl' + $lvl;
42 + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';
43 + var $errorKeyword = $exclusiveKeyword;
44 + var $$outStack = $$outStack || [];
45 + $$outStack.push(out);
46 + out = ''; /* istanbul ignore else */
47 + if (it.createErrors !== false) {
48 + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
49 + if (it.opts.messages !== false) {
50 + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' ';
51 + }
52 + if (it.opts.verbose) {
53 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
54 + }
55 + out += ' } ';
56 + } else {
57 + out += ' {} ';
58 + }
59 + var __err = out;
60 + out = $$outStack.pop();
61 + if (!it.compositeRule && $breakOnError) {
62 + /* istanbul ignore if */
63 + if (it.async) {
64 + out += ' throw new ValidationError([' + (__err) + ']); ';
65 + } else {
66 + out += ' validate.errors = [' + (__err) + ']; return false; ';
67 + }
68 + } else {
69 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
70 + }
71 + out += ' } else if ( ';
72 + if ($isData) {
73 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
74 + }
75 + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; ';
76 + if ($schema === undefined) {
77 + $errorKeyword = $exclusiveKeyword;
78 + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
79 + $schemaValue = $schemaValueExcl;
80 + $isData = $isDataExcl;
81 + }
82 + } else {
83 + var $exclIsNumber = typeof $schemaExcl == 'number',
84 + $opStr = $op;
85 + if ($exclIsNumber && $isData) {
86 + var $opExpr = '\'' + $opStr + '\'';
87 + out += ' if ( ';
88 + if ($isData) {
89 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
90 + }
91 + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';
92 + } else {
93 + if ($exclIsNumber && $schema === undefined) {
94 + $exclusive = true;
95 + $errorKeyword = $exclusiveKeyword;
96 + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
97 + $schemaValue = $schemaExcl;
98 + $notOp += '=';
99 + } else {
100 + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);
101 + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
102 + $exclusive = true;
103 + $errorKeyword = $exclusiveKeyword;
104 + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;
105 + $notOp += '=';
106 + } else {
107 + $exclusive = false;
108 + $opStr += '=';
109 + }
110 + }
111 + var $opExpr = '\'' + $opStr + '\'';
112 + out += ' if ( ';
113 + if ($isData) {
114 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
115 + }
116 + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';
117 + }
118 + }
119 + $errorKeyword = $errorKeyword || $keyword;
120 + var $$outStack = $$outStack || [];
121 + $$outStack.push(out);
122 + out = ''; /* istanbul ignore else */
123 + if (it.createErrors !== false) {
124 + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';
125 + if (it.opts.messages !== false) {
126 + out += ' , message: \'should be ' + ($opStr) + ' ';
127 + if ($isData) {
128 + out += '\' + ' + ($schemaValue);
129 + } else {
130 + out += '' + ($schemaValue) + '\'';
131 + }
132 + }
133 + if (it.opts.verbose) {
134 + out += ' , schema: ';
135 + if ($isData) {
136 + out += 'validate.schema' + ($schemaPath);
137 + } else {
138 + out += '' + ($schema);
139 + }
140 + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
141 + }
142 + out += ' } ';
143 + } else {
144 + out += ' {} ';
145 + }
146 + var __err = out;
147 + out = $$outStack.pop();
148 + if (!it.compositeRule && $breakOnError) {
149 + /* istanbul ignore if */
150 + if (it.async) {
151 + out += ' throw new ValidationError([' + (__err) + ']); ';
152 + } else {
153 + out += ' validate.errors = [' + (__err) + ']; return false; ';
154 + }
155 + } else {
156 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
157 + }
158 + out += ' } ';
159 + if ($breakOnError) {
160 + out += ' else { ';
161 + }
162 + return out;
163 +}
1 +'use strict';
2 +module.exports = function generate__limitItems(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $errorKeyword;
11 + var $data = 'data' + ($dataLvl || '');
12 + var $isData = it.opts.$data && $schema && $schema.$data,
13 + $schemaValue;
14 + if ($isData) {
15 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
16 + $schemaValue = 'schema' + $lvl;
17 + } else {
18 + $schemaValue = $schema;
19 + }
20 + if (!($isData || typeof $schema == 'number')) {
21 + throw new Error($keyword + ' must be number');
22 + }
23 + var $op = $keyword == 'maxItems' ? '>' : '<';
24 + out += 'if ( ';
25 + if ($isData) {
26 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
27 + }
28 + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';
29 + var $errorKeyword = $keyword;
30 + var $$outStack = $$outStack || [];
31 + $$outStack.push(out);
32 + out = ''; /* istanbul ignore else */
33 + if (it.createErrors !== false) {
34 + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
35 + if (it.opts.messages !== false) {
36 + out += ' , message: \'should NOT have ';
37 + if ($keyword == 'maxItems') {
38 + out += 'more';
39 + } else {
40 + out += 'fewer';
41 + }
42 + out += ' than ';
43 + if ($isData) {
44 + out += '\' + ' + ($schemaValue) + ' + \'';
45 + } else {
46 + out += '' + ($schema);
47 + }
48 + out += ' items\' ';
49 + }
50 + if (it.opts.verbose) {
51 + out += ' , schema: ';
52 + if ($isData) {
53 + out += 'validate.schema' + ($schemaPath);
54 + } else {
55 + out += '' + ($schema);
56 + }
57 + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
58 + }
59 + out += ' } ';
60 + } else {
61 + out += ' {} ';
62 + }
63 + var __err = out;
64 + out = $$outStack.pop();
65 + if (!it.compositeRule && $breakOnError) {
66 + /* istanbul ignore if */
67 + if (it.async) {
68 + out += ' throw new ValidationError([' + (__err) + ']); ';
69 + } else {
70 + out += ' validate.errors = [' + (__err) + ']; return false; ';
71 + }
72 + } else {
73 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
74 + }
75 + out += '} ';
76 + if ($breakOnError) {
77 + out += ' else { ';
78 + }
79 + return out;
80 +}
1 +'use strict';
2 +module.exports = function generate__limitLength(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $errorKeyword;
11 + var $data = 'data' + ($dataLvl || '');
12 + var $isData = it.opts.$data && $schema && $schema.$data,
13 + $schemaValue;
14 + if ($isData) {
15 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
16 + $schemaValue = 'schema' + $lvl;
17 + } else {
18 + $schemaValue = $schema;
19 + }
20 + if (!($isData || typeof $schema == 'number')) {
21 + throw new Error($keyword + ' must be number');
22 + }
23 + var $op = $keyword == 'maxLength' ? '>' : '<';
24 + out += 'if ( ';
25 + if ($isData) {
26 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
27 + }
28 + if (it.opts.unicode === false) {
29 + out += ' ' + ($data) + '.length ';
30 + } else {
31 + out += ' ucs2length(' + ($data) + ') ';
32 + }
33 + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';
34 + var $errorKeyword = $keyword;
35 + var $$outStack = $$outStack || [];
36 + $$outStack.push(out);
37 + out = ''; /* istanbul ignore else */
38 + if (it.createErrors !== false) {
39 + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
40 + if (it.opts.messages !== false) {
41 + out += ' , message: \'should NOT be ';
42 + if ($keyword == 'maxLength') {
43 + out += 'longer';
44 + } else {
45 + out += 'shorter';
46 + }
47 + out += ' than ';
48 + if ($isData) {
49 + out += '\' + ' + ($schemaValue) + ' + \'';
50 + } else {
51 + out += '' + ($schema);
52 + }
53 + out += ' characters\' ';
54 + }
55 + if (it.opts.verbose) {
56 + out += ' , schema: ';
57 + if ($isData) {
58 + out += 'validate.schema' + ($schemaPath);
59 + } else {
60 + out += '' + ($schema);
61 + }
62 + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
63 + }
64 + out += ' } ';
65 + } else {
66 + out += ' {} ';
67 + }
68 + var __err = out;
69 + out = $$outStack.pop();
70 + if (!it.compositeRule && $breakOnError) {
71 + /* istanbul ignore if */
72 + if (it.async) {
73 + out += ' throw new ValidationError([' + (__err) + ']); ';
74 + } else {
75 + out += ' validate.errors = [' + (__err) + ']; return false; ';
76 + }
77 + } else {
78 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
79 + }
80 + out += '} ';
81 + if ($breakOnError) {
82 + out += ' else { ';
83 + }
84 + return out;
85 +}
1 +'use strict';
2 +module.exports = function generate__limitProperties(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $errorKeyword;
11 + var $data = 'data' + ($dataLvl || '');
12 + var $isData = it.opts.$data && $schema && $schema.$data,
13 + $schemaValue;
14 + if ($isData) {
15 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
16 + $schemaValue = 'schema' + $lvl;
17 + } else {
18 + $schemaValue = $schema;
19 + }
20 + if (!($isData || typeof $schema == 'number')) {
21 + throw new Error($keyword + ' must be number');
22 + }
23 + var $op = $keyword == 'maxProperties' ? '>' : '<';
24 + out += 'if ( ';
25 + if ($isData) {
26 + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';
27 + }
28 + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';
29 + var $errorKeyword = $keyword;
30 + var $$outStack = $$outStack || [];
31 + $$outStack.push(out);
32 + out = ''; /* istanbul ignore else */
33 + if (it.createErrors !== false) {
34 + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';
35 + if (it.opts.messages !== false) {
36 + out += ' , message: \'should NOT have ';
37 + if ($keyword == 'maxProperties') {
38 + out += 'more';
39 + } else {
40 + out += 'fewer';
41 + }
42 + out += ' than ';
43 + if ($isData) {
44 + out += '\' + ' + ($schemaValue) + ' + \'';
45 + } else {
46 + out += '' + ($schema);
47 + }
48 + out += ' properties\' ';
49 + }
50 + if (it.opts.verbose) {
51 + out += ' , schema: ';
52 + if ($isData) {
53 + out += 'validate.schema' + ($schemaPath);
54 + } else {
55 + out += '' + ($schema);
56 + }
57 + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
58 + }
59 + out += ' } ';
60 + } else {
61 + out += ' {} ';
62 + }
63 + var __err = out;
64 + out = $$outStack.pop();
65 + if (!it.compositeRule && $breakOnError) {
66 + /* istanbul ignore if */
67 + if (it.async) {
68 + out += ' throw new ValidationError([' + (__err) + ']); ';
69 + } else {
70 + out += ' validate.errors = [' + (__err) + ']; return false; ';
71 + }
72 + } else {
73 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
74 + }
75 + out += '} ';
76 + if ($breakOnError) {
77 + out += ' else { ';
78 + }
79 + return out;
80 +}
1 +'use strict';
2 +module.exports = function generate_allOf(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $schema = it.schema[$keyword];
5 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
6 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
7 + var $breakOnError = !it.opts.allErrors;
8 + var $it = it.util.copy(it);
9 + var $closingBraces = '';
10 + $it.level++;
11 + var $nextValid = 'valid' + $it.level;
12 + var $currentBaseId = $it.baseId,
13 + $allSchemasEmpty = true;
14 + var arr1 = $schema;
15 + if (arr1) {
16 + var $sch, $i = -1,
17 + l1 = arr1.length - 1;
18 + while ($i < l1) {
19 + $sch = arr1[$i += 1];
20 + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
21 + $allSchemasEmpty = false;
22 + $it.schema = $sch;
23 + $it.schemaPath = $schemaPath + '[' + $i + ']';
24 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
25 + out += ' ' + (it.validate($it)) + ' ';
26 + $it.baseId = $currentBaseId;
27 + if ($breakOnError) {
28 + out += ' if (' + ($nextValid) + ') { ';
29 + $closingBraces += '}';
30 + }
31 + }
32 + }
33 + }
34 + if ($breakOnError) {
35 + if ($allSchemasEmpty) {
36 + out += ' if (true) { ';
37 + } else {
38 + out += ' ' + ($closingBraces.slice(0, -1)) + ' ';
39 + }
40 + }
41 + return out;
42 +}
1 +'use strict';
2 +module.exports = function generate_anyOf(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $data = 'data' + ($dataLvl || '');
11 + var $valid = 'valid' + $lvl;
12 + var $errs = 'errs__' + $lvl;
13 + var $it = it.util.copy(it);
14 + var $closingBraces = '';
15 + $it.level++;
16 + var $nextValid = 'valid' + $it.level;
17 + var $noEmptySchema = $schema.every(function($sch) {
18 + return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));
19 + });
20 + if ($noEmptySchema) {
21 + var $currentBaseId = $it.baseId;
22 + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; ';
23 + var $wasComposite = it.compositeRule;
24 + it.compositeRule = $it.compositeRule = true;
25 + var arr1 = $schema;
26 + if (arr1) {
27 + var $sch, $i = -1,
28 + l1 = arr1.length - 1;
29 + while ($i < l1) {
30 + $sch = arr1[$i += 1];
31 + $it.schema = $sch;
32 + $it.schemaPath = $schemaPath + '[' + $i + ']';
33 + $it.errSchemaPath = $errSchemaPath + '/' + $i;
34 + out += ' ' + (it.validate($it)) + ' ';
35 + $it.baseId = $currentBaseId;
36 + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';
37 + $closingBraces += '}';
38 + }
39 + }
40 + it.compositeRule = $it.compositeRule = $wasComposite;
41 + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */
42 + if (it.createErrors !== false) {
43 + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
44 + if (it.opts.messages !== false) {
45 + out += ' , message: \'should match some schema in anyOf\' ';
46 + }
47 + if (it.opts.verbose) {
48 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
49 + }
50 + out += ' } ';
51 + } else {
52 + out += ' {} ';
53 + }
54 + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
55 + if (!it.compositeRule && $breakOnError) {
56 + /* istanbul ignore if */
57 + if (it.async) {
58 + out += ' throw new ValidationError(vErrors); ';
59 + } else {
60 + out += ' validate.errors = vErrors; return false; ';
61 + }
62 + }
63 + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
64 + if (it.opts.allErrors) {
65 + out += ' } ';
66 + }
67 + } else {
68 + if ($breakOnError) {
69 + out += ' if (true) { ';
70 + }
71 + }
72 + return out;
73 +}
1 +'use strict';
2 +module.exports = function generate_comment(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $schema = it.schema[$keyword];
5 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
6 + var $breakOnError = !it.opts.allErrors;
7 + var $comment = it.util.toQuotedString($schema);
8 + if (it.opts.$comment === true) {
9 + out += ' console.log(' + ($comment) + ');';
10 + } else if (typeof it.opts.$comment == 'function') {
11 + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';
12 + }
13 + return out;
14 +}
1 +'use strict';
2 +module.exports = function generate_const(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $data = 'data' + ($dataLvl || '');
11 + var $valid = 'valid' + $lvl;
12 + var $isData = it.opts.$data && $schema && $schema.$data,
13 + $schemaValue;
14 + if ($isData) {
15 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
16 + $schemaValue = 'schema' + $lvl;
17 + } else {
18 + $schemaValue = $schema;
19 + }
20 + if (!$isData) {
21 + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';
22 + }
23 + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { ';
24 + var $$outStack = $$outStack || [];
25 + $$outStack.push(out);
26 + out = ''; /* istanbul ignore else */
27 + if (it.createErrors !== false) {
28 + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';
29 + if (it.opts.messages !== false) {
30 + out += ' , message: \'should be equal to constant\' ';
31 + }
32 + if (it.opts.verbose) {
33 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
34 + }
35 + out += ' } ';
36 + } else {
37 + out += ' {} ';
38 + }
39 + var __err = out;
40 + out = $$outStack.pop();
41 + if (!it.compositeRule && $breakOnError) {
42 + /* istanbul ignore if */
43 + if (it.async) {
44 + out += ' throw new ValidationError([' + (__err) + ']); ';
45 + } else {
46 + out += ' validate.errors = [' + (__err) + ']; return false; ';
47 + }
48 + } else {
49 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
50 + }
51 + out += ' }';
52 + if ($breakOnError) {
53 + out += ' else { ';
54 + }
55 + return out;
56 +}
1 +'use strict';
2 +module.exports = function generate_contains(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $data = 'data' + ($dataLvl || '');
11 + var $valid = 'valid' + $lvl;
12 + var $errs = 'errs__' + $lvl;
13 + var $it = it.util.copy(it);
14 + var $closingBraces = '';
15 + $it.level++;
16 + var $nextValid = 'valid' + $it.level;
17 + var $idx = 'i' + $lvl,
18 + $dataNxt = $it.dataLevel = it.dataLevel + 1,
19 + $nextData = 'data' + $dataNxt,
20 + $currentBaseId = it.baseId,
21 + $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));
22 + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
23 + if ($nonEmptySchema) {
24 + var $wasComposite = it.compositeRule;
25 + it.compositeRule = $it.compositeRule = true;
26 + $it.schema = $schema;
27 + $it.schemaPath = $schemaPath;
28 + $it.errSchemaPath = $errSchemaPath;
29 + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';
30 + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
31 + var $passData = $data + '[' + $idx + ']';
32 + $it.dataPathArr[$dataNxt] = $idx;
33 + var $code = it.validate($it);
34 + $it.baseId = $currentBaseId;
35 + if (it.util.varOccurences($code, $nextData) < 2) {
36 + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';
37 + } else {
38 + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';
39 + }
40 + out += ' if (' + ($nextValid) + ') break; } ';
41 + it.compositeRule = $it.compositeRule = $wasComposite;
42 + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';
43 + } else {
44 + out += ' if (' + ($data) + '.length == 0) {';
45 + }
46 + var $$outStack = $$outStack || [];
47 + $$outStack.push(out);
48 + out = ''; /* istanbul ignore else */
49 + if (it.createErrors !== false) {
50 + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';
51 + if (it.opts.messages !== false) {
52 + out += ' , message: \'should contain a valid item\' ';
53 + }
54 + if (it.opts.verbose) {
55 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
56 + }
57 + out += ' } ';
58 + } else {
59 + out += ' {} ';
60 + }
61 + var __err = out;
62 + out = $$outStack.pop();
63 + if (!it.compositeRule && $breakOnError) {
64 + /* istanbul ignore if */
65 + if (it.async) {
66 + out += ' throw new ValidationError([' + (__err) + ']); ';
67 + } else {
68 + out += ' validate.errors = [' + (__err) + ']; return false; ';
69 + }
70 + } else {
71 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
72 + }
73 + out += ' } else { ';
74 + if ($nonEmptySchema) {
75 + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';
76 + }
77 + if (it.opts.allErrors) {
78 + out += ' } ';
79 + }
80 + return out;
81 +}
1 +'use strict';
2 +module.exports = function generate_custom(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $errorKeyword;
11 + var $data = 'data' + ($dataLvl || '');
12 + var $valid = 'valid' + $lvl;
13 + var $errs = 'errs__' + $lvl;
14 + var $isData = it.opts.$data && $schema && $schema.$data,
15 + $schemaValue;
16 + if ($isData) {
17 + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';
18 + $schemaValue = 'schema' + $lvl;
19 + } else {
20 + $schemaValue = $schema;
21 + }
22 + var $rule = this,
23 + $definition = 'definition' + $lvl,
24 + $rDef = $rule.definition,
25 + $closingBraces = '';
26 + var $compile, $inline, $macro, $ruleValidate, $validateCode;
27 + if ($isData && $rDef.$data) {
28 + $validateCode = 'keywordValidate' + $lvl;
29 + var $validateSchema = $rDef.validateSchema;
30 + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';
31 + } else {
32 + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
33 + if (!$ruleValidate) return;
34 + $schemaValue = 'validate.schema' + $schemaPath;
35 + $validateCode = $ruleValidate.code;
36 + $compile = $rDef.compile;
37 + $inline = $rDef.inline;
38 + $macro = $rDef.macro;
39 + }
40 + var $ruleErrs = $validateCode + '.errors',
41 + $i = 'i' + $lvl,
42 + $ruleErr = 'ruleErr' + $lvl,
43 + $asyncKeyword = $rDef.async;
44 + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');
45 + if (!($inline || $macro)) {
46 + out += '' + ($ruleErrs) + ' = null;';
47 + }
48 + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';
49 + if ($isData && $rDef.$data) {
50 + $closingBraces += '}';
51 + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';
52 + if ($validateSchema) {
53 + $closingBraces += '}';
54 + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';
55 + }
56 + }
57 + if ($inline) {
58 + if ($rDef.statements) {
59 + out += ' ' + ($ruleValidate.validate) + ' ';
60 + } else {
61 + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';
62 + }
63 + } else if ($macro) {
64 + var $it = it.util.copy(it);
65 + var $closingBraces = '';
66 + $it.level++;
67 + var $nextValid = 'valid' + $it.level;
68 + $it.schema = $ruleValidate.validate;
69 + $it.schemaPath = '';
70 + var $wasComposite = it.compositeRule;
71 + it.compositeRule = $it.compositeRule = true;
72 + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
73 + it.compositeRule = $it.compositeRule = $wasComposite;
74 + out += ' ' + ($code);
75 + } else {
76 + var $$outStack = $$outStack || [];
77 + $$outStack.push(out);
78 + out = '';
79 + out += ' ' + ($validateCode) + '.call( ';
80 + if (it.opts.passContext) {
81 + out += 'this';
82 + } else {
83 + out += 'self';
84 + }
85 + if ($compile || $rDef.schema === false) {
86 + out += ' , ' + ($data) + ' ';
87 + } else {
88 + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';
89 + }
90 + out += ' , (dataPath || \'\')';
91 + if (it.errorPath != '""') {
92 + out += ' + ' + (it.errorPath);
93 + }
94 + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',
95 + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';
96 + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) ';
97 + var def_callRuleValidate = out;
98 + out = $$outStack.pop();
99 + if ($rDef.errors === false) {
100 + out += ' ' + ($valid) + ' = ';
101 + if ($asyncKeyword) {
102 + out += 'await ';
103 + }
104 + out += '' + (def_callRuleValidate) + '; ';
105 + } else {
106 + if ($asyncKeyword) {
107 + $ruleErrs = 'customErrors' + $lvl;
108 + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';
109 + } else {
110 + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';
111 + }
112 + }
113 + }
114 + if ($rDef.modifying) {
115 + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';
116 + }
117 + out += '' + ($closingBraces);
118 + if ($rDef.valid) {
119 + if ($breakOnError) {
120 + out += ' if (true) { ';
121 + }
122 + } else {
123 + out += ' if ( ';
124 + if ($rDef.valid === undefined) {
125 + out += ' !';
126 + if ($macro) {
127 + out += '' + ($nextValid);
128 + } else {
129 + out += '' + ($valid);
130 + }
131 + } else {
132 + out += ' ' + (!$rDef.valid) + ' ';
133 + }
134 + out += ') { ';
135 + $errorKeyword = $rule.keyword;
136 + var $$outStack = $$outStack || [];
137 + $$outStack.push(out);
138 + out = '';
139 + var $$outStack = $$outStack || [];
140 + $$outStack.push(out);
141 + out = ''; /* istanbul ignore else */
142 + if (it.createErrors !== false) {
143 + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
144 + if (it.opts.messages !== false) {
145 + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
146 + }
147 + if (it.opts.verbose) {
148 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
149 + }
150 + out += ' } ';
151 + } else {
152 + out += ' {} ';
153 + }
154 + var __err = out;
155 + out = $$outStack.pop();
156 + if (!it.compositeRule && $breakOnError) {
157 + /* istanbul ignore if */
158 + if (it.async) {
159 + out += ' throw new ValidationError([' + (__err) + ']); ';
160 + } else {
161 + out += ' validate.errors = [' + (__err) + ']; return false; ';
162 + }
163 + } else {
164 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
165 + }
166 + var def_customError = out;
167 + out = $$outStack.pop();
168 + if ($inline) {
169 + if ($rDef.errors) {
170 + if ($rDef.errors != 'full') {
171 + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
172 + if (it.opts.verbose) {
173 + out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
174 + }
175 + out += ' } ';
176 + }
177 + } else {
178 + if ($rDef.errors === false) {
179 + out += ' ' + (def_customError) + ' ';
180 + } else {
181 + out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else { for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; } ';
182 + if (it.opts.verbose) {
183 + out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
184 + }
185 + out += ' } } ';
186 + }
187 + }
188 + } else if ($macro) {
189 + out += ' var err = '; /* istanbul ignore else */
190 + if (it.createErrors !== false) {
191 + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } ';
192 + if (it.opts.messages !== false) {
193 + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' ';
194 + }
195 + if (it.opts.verbose) {
196 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
197 + }
198 + out += ' } ';
199 + } else {
200 + out += ' {} ';
201 + }
202 + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
203 + if (!it.compositeRule && $breakOnError) {
204 + /* istanbul ignore if */
205 + if (it.async) {
206 + out += ' throw new ValidationError(vErrors); ';
207 + } else {
208 + out += ' validate.errors = vErrors; return false; ';
209 + }
210 + }
211 + } else {
212 + if ($rDef.errors === false) {
213 + out += ' ' + (def_customError) + ' ';
214 + } else {
215 + out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length; for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \'\') + ' + (it.errorPath) + '; ' + ($ruleErr) + '.schemaPath = "' + ($errSchemaPath) + '"; ';
216 + if (it.opts.verbose) {
217 + out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';
218 + }
219 + out += ' } } else { ' + (def_customError) + ' } ';
220 + }
221 + }
222 + out += ' } ';
223 + if ($breakOnError) {
224 + out += ' else { ';
225 + }
226 + }
227 + return out;
228 +}
1 +'use strict';
2 +module.exports = function generate_dependencies(it, $keyword, $ruleType) {
3 + var out = ' ';
4 + var $lvl = it.level;
5 + var $dataLvl = it.dataLevel;
6 + var $schema = it.schema[$keyword];
7 + var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
8 + var $errSchemaPath = it.errSchemaPath + '/' + $keyword;
9 + var $breakOnError = !it.opts.allErrors;
10 + var $data = 'data' + ($dataLvl || '');
11 + var $errs = 'errs__' + $lvl;
12 + var $it = it.util.copy(it);
13 + var $closingBraces = '';
14 + $it.level++;
15 + var $nextValid = 'valid' + $it.level;
16 + var $schemaDeps = {},
17 + $propertyDeps = {},
18 + $ownProperties = it.opts.ownProperties;
19 + for ($property in $schema) {
20 + if ($property == '__proto__') continue;
21 + var $sch = $schema[$property];
22 + var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
23 + $deps[$property] = $sch;
24 + }
25 + out += 'var ' + ($errs) + ' = errors;';
26 + var $currentErrorPath = it.errorPath;
27 + out += 'var missing' + ($lvl) + ';';
28 + for (var $property in $propertyDeps) {
29 + $deps = $propertyDeps[$property];
30 + if ($deps.length) {
31 + out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
32 + if ($ownProperties) {
33 + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
34 + }
35 + if ($breakOnError) {
36 + out += ' && ( ';
37 + var arr1 = $deps;
38 + if (arr1) {
39 + var $propertyKey, $i = -1,
40 + l1 = arr1.length - 1;
41 + while ($i < l1) {
42 + $propertyKey = arr1[$i += 1];
43 + if ($i) {
44 + out += ' || ';
45 + }
46 + var $prop = it.util.getProperty($propertyKey),
47 + $useData = $data + $prop;
48 + out += ' ( ( ' + ($useData) + ' === undefined ';
49 + if ($ownProperties) {
50 + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
51 + }
52 + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';
53 + }
54 + }
55 + out += ')) { ';
56 + var $propertyPath = 'missing' + $lvl,
57 + $missingProperty = '\' + ' + $propertyPath + ' + \'';
58 + if (it.opts._errorDataPathProperty) {
59 + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;
60 + }
61 + var $$outStack = $$outStack || [];
62 + $$outStack.push(out);
63 + out = ''; /* istanbul ignore else */
64 + if (it.createErrors !== false) {
65 + out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
66 + if (it.opts.messages !== false) {
67 + out += ' , message: \'should have ';
68 + if ($deps.length == 1) {
69 + out += 'property ' + (it.util.escapeQuotes($deps[0]));
70 + } else {
71 + out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
72 + }
73 + out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
74 + }
75 + if (it.opts.verbose) {
76 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
77 + }
78 + out += ' } ';
79 + } else {
80 + out += ' {} ';
81 + }
82 + var __err = out;
83 + out = $$outStack.pop();
84 + if (!it.compositeRule && $breakOnError) {
85 + /* istanbul ignore if */
86 + if (it.async) {
87 + out += ' throw new ValidationError([' + (__err) + ']); ';
88 + } else {
89 + out += ' validate.errors = [' + (__err) + ']; return false; ';
90 + }
91 + } else {
92 + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';
93 + }
94 + } else {
95 + out += ' ) { ';
96 + var arr2 = $deps;
97 + if (arr2) {
98 + var $propertyKey, i2 = -1,
99 + l2 = arr2.length - 1;
100 + while (i2 < l2) {
101 + $propertyKey = arr2[i2 += 1];
102 + var $prop = it.util.getProperty($propertyKey),
103 + $missingProperty = it.util.escapeQuotes($propertyKey),
104 + $useData = $data + $prop;
105 + if (it.opts._errorDataPathProperty) {
106 + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
107 + }
108 + out += ' if ( ' + ($useData) + ' === undefined ';
109 + if ($ownProperties) {
110 + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';
111 + }
112 + out += ') { var err = '; /* istanbul ignore else */
113 + if (it.createErrors !== false) {
114 + out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } ';
115 + if (it.opts.messages !== false) {
116 + out += ' , message: \'should have ';
117 + if ($deps.length == 1) {
118 + out += 'property ' + (it.util.escapeQuotes($deps[0]));
119 + } else {
120 + out += 'properties ' + (it.util.escapeQuotes($deps.join(", ")));
121 + }
122 + out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';
123 + }
124 + if (it.opts.verbose) {
125 + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';
126 + }
127 + out += ' } ';
128 + } else {
129 + out += ' {} ';
130 + }
131 + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';
132 + }
133 + }
134 + }
135 + out += ' } ';
136 + if ($breakOnError) {
137 + $closingBraces += '}';
138 + out += ' else { ';
139 + }
140 + }
141 + }
142 + it.errorPath = $currentErrorPath;
143 + var $currentBaseId = $it.baseId;
144 + for (var $property in $schemaDeps) {
145 + var $sch = $schemaDeps[$property];
146 + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {
147 + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';
148 + if ($ownProperties) {
149 + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';
150 + }
151 + out += ') { ';
152 + $it.schema = $sch;
153 + $it.schemaPath = $schemaPath + it.util.getProperty($property);
154 + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);
155 + out += ' ' + (it.validate($it)) + ' ';
156 + $it.baseId = $currentBaseId;
157 + out += ' } ';
158 + if ($breakOnError) {
159 + out += ' if (' + ($nextValid) + ') { ';
160 + $closingBraces += '}';
161 + }
162 + }
163 + }
164 + if ($breakOnError) {
165 + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';
166 + }
167 + return out;
168 +}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.