박지환

Remove unnecessary files

Showing 1000 changed files with 0 additions and 4808 deletions

Too many changes to show.

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

1 -- 1월1일
2 -새해의 첫날이며, 영어로는 New Years Day라고 한다.
3 -
4 -1. 제야의 종(보신각)
5 -보신각은 서울 종로구이 취치에 있는 종각으로 서울보신각종을 걸어 둘 수 있게 만든 것이다.
6 -이 종은 1986년에 제작된 '서울대종'이며, 새해 첫날의 시작을 알리는 용도로 사용된다.
7 -
8 -보신각 타종신청
9 -https://culture.seoul.go.kr/culture/main/contents.do?menuNo=200049
10 -
11 -2. 해돋이
12 -해는 매일 뜨지만 신년의 첫 해는 특별하게 느껴진다. 새해 첫날에 해돋이를 보면서 소원을
13 -빌어보는 건 어떨까?
14 -
15 -일출시간
16 -https://m.search.naver.com/search.naver?sm=mtb_hty.top&where=m&oquery=%ED%95%B4%EB%8F%8B%EC%9D%B4&tqi=hiXs9sp0JWoss4RGdChssssss5R-149632&query=%EC%9D%BC%EC%B6%9C%EC%8B%9C%EA%B0%84
17 -
18 -- 설날
19 -설날은 추석과 함께 대표적인 한국의 명절중 하나이다. 음력으로 1월1일이며
20 -설이라고도 불린다. 현재 한국은 양력 1월 1일은 새해로 기념하고, 친척들을 만다는
21 -전통 명절 기념은 음력 1월 1일에 한다.
22 -
23 -가족들과 함께 즐거운 설을 보내보자!
24 -
25 -- 삼일절
26 -삼일절은 3·1 운동을 기념하기 위해 제정된 국경일이다. 1920년 임시 정부가 만들어진 이후
27 -국경일로 지정되어 기념되기 시작하였다.
28 -
29 -1. 서대문형무소 역사관
30 -서대문구에 위치한 역사관으로 일본이 한국의 독립운동가들을 가두기 위해 만든 감옥이다.
31 -서대문형무소 역사관에는 이러한 역사의 흔적이 그대로 남아있다.
32 -https://sphh.sscmc.or.kr/
33 -2. 독립기념관
34 -충남 천안시에 위치해 있으며 삼일절에 다양한 행사를 한다.
35 -https://i815.or.kr/2018/tour/location.do
36 -
37 -- 대통령선거일
38 -대통령 선거일로 지정된 날로 대학민국에서 법정공휴일로 지정되고 있다.
39 -
40 -모두가 투표에 참여함으로써 귀중한 표를 선사해야하는 날이다.
41 -https://si.nec.go.kr/necsps/sps.MainSpsSrchVoterPolls.nec
42 -
43 -- 어린이날
44 -어린이날은 미래 사회의 주인공이 될 아이들이 예쁘게 자라날 수 있도록
45 -제정된 날로 우리나라 뿐만 아니라 다른 나라에서도 기념일로 정하고 있다.
46 -
47 -1. 롯데월드
48 -서울의 대표적 명소로 서울에 거주중이라면 편하게 갈 수 있는 곳이다. 아이들이
49 -좋아하는 테마파크가 존재한다.
50 -http://www.lotteworld.com/gate.html
51 -
52 -2. 서울 어린이 대공원
53 -서울에서 제일 큰 놀이터라는 별명을 가진 공원이다. 놀이동산 뿐만 아니라 동물원까지
54 -있어 사실상 아이들이 놀기 딱 좋은 놀이시설이다.
55 -http://www.lotteworld.com/gate.html
56 -
57 -- 부처님오신날
58 -석가모니를 기념하기 위해 제정된 법정 공휴일이다. 음력 4월 8일을 기반으로 한다.
59 -
60 -1. 봉은사
61 -봉은사는 서울 한가운데에 있을 뿐 아니라 역과의 거리도 가까워 부담없이
62 -방문할 수 있는 사찰 중 하나이다. 삼성동 근처에 있으며 신라 시대에 창건되었다.
63 -부처님오신날에는 연등 축제 등 행사를 연다.
64 -http://www.bongeunsa.org/
65 -
66 -2. 조계사
67 -조계사 또한 서울 시내에 있는 사찰이다. 비록 규모는 아담하지만 우리나라의 최대
68 -불교 종단의 본사이며 크고 아름다운 대웅전이 있다. 조계사 주변에는 불교 서적을
69 -구할수 잇는 서점, 템플스테이, 불교용품 가게 등 불표와 관련된 것들을 취급하는 곳이 많다.
70 -https://www.jogyesa.kr/
71 -
72 -2022년 6월 1일
73 -지방선거로 지정된 날로 대한민국에서 가장 중요한 날 중 하나이다.
74 -
75 -모두가 투표에 참여함으로써 귀중한 표를 선사해야하는 날이다.
76 -
77 -2022년 6월 6일
78 -현충일은 나라를 위해 희생한 순국선열과 장병들을 기리기 위해 지정된
79 -기념일이다.
80 -
81 -1. 국립 서울 현충원
82 -서울 동작역 근처에 위치하고 있으며, 국가를 위해 희생한 분들을 모신 국립묘지입니다.
83 -
84 -2. 용산 전쟁기념관
85 -선사시대부터 현대까지의 국가에 헌신한 분들의 공훈과 호국전쟁 자료 등이
86 -실물, 복제품으로 전시되어 있다.
87 -
88 -3. 김포함상공원
89 -52년간 바다를 지켜온 운봉함을 개조한 공원으로 실제로 사용된 전함을
90 -볼 수 있다.
91 -
92 -2022년 8월 15일
93 -광복절은 대한민국이 일본으로부터 해방된 것을 기념하는 날이다.
94 -
95 -1. 서대문형무소 역사관
96 -서울 종로구에 위치한 역사 박물관으로 대한민국 서녕ㄹ들의 자주독립정신을
97 -배울 수 있는 곳이다.
98 -
99 -2. 전쟁기념관
100 -서울 용산구에 위치해 있으며, 호국 자료를 전시하고 전쟁의 통해 얻을 수 있는
101 -교훈과 호국정신을 배양한다.
102 -
103 -3. 근현대사 기념관
104 -순국선열의 묘역과 4/19민주묘지가 자리잡고 있다.
105 -
106 -2022년 9월 9일~11일
107 -추석은 음력 8월 15일에 치르는 행사이고, 설날과 함께 한국의 주요 연휴이다.
108 -
109 -가족들과 함께 보름달 같이 풍성한 한가위 보내자.
110 -
111 -2022년 10월 3일
112 -개천절은 대한민국의 국경일중 하나이며, 단군왕검이 고조선을 세운 것을 기념하는 날이다.
113 -
114 -1. 인천 차이나 타운
115 -'먹방 여행'뿐만 아니라, 역사 투어까지 가능한 곳이다. 우리가 즐겨먹는 짜장면이 바로 인천
116 -차이나타운에서 탄생했으며, 가장 오래된 중국집이 '짜장면박물관'으로 리모델링돼 운영중이다.
117 -
118 -2. 태백 동굴 여행
119 -태백에는 많은 동굴들이 있으며, 당일치기여행으로 갈만한 곳이 많다.
120 -
121 -2022년 10월 10일
122 -한글날은 세종대왕이 훈민정음을 창제한 것을 기념하기 위해 만들어진 기념일이다.
123 -
124 -1. 서울 시청 일대
125 -서울 시청 근처에는 다양한 한글날 행사가 열린다.
126 -
127 -2. 광화문 세종대왕 동상
128 -세종대황 동상이 있는 광화문 광장 지하에는 세종이야기와 충무공 이야기가 전시되어 있다.
129 -전시관 안에는 다양한 세종대왕 관련 서적이 자리하고 있다.
130 -
131 -2022년 12월 25일~26일
132 -예수 그리스도의 탄생을 기리는 기념일이다. 한 겨울에 있는 공휴일로 많은 사람들이
133 -연인이나 가족들과 함께 시간을 보낸다.
134 -
135 -1.분천역 산타마을
136 -분천역은 국내 최초의 개방형 관광 열차인 백두개간 열차가 출밯하는 역이다.
137 -역 주변에는 다양한 크리스마스 모형들이 있다.
138 -
139 -2. 에버랜드
140 -크리스마스 기간동안 에버랜드는 낭만적인 크리스마스 분위기를 연출한다.
141 -매일 1~2회씩 크리스마스 퍼레이드를 선보인다.
142 -<% } else if (data[1] == '20220606') { %>
143 - <h2>1. 어린이날 즐기기.</h2>
144 - <h2>2. 놀이공원 </h2>
145 - <h2>3. 서울숲</h2>
146 - <% } else if (data[1] == '20220815') { %>
147 - <h2>1. 어린이날 즐기기.</h2>
148 - <h2>2. 놀이공원 </h2>
149 - <h2>3. 서울숲</h2>
150 - <% } else if (data[1] == '20220909') { %>
151 - <h2>1. 어린이날 즐기기.</h2>
152 - <h2>2. 놀이공원 </h2>
153 - <h2>3. 서울숲</h2>
154 - <% } else if (data[1] == '20220505') { %>
155 - <h2>1. 어린이날 즐기기.</h2>
156 - <h2>2. 놀이공원 </h2>
157 - <h2>3. 서울숲</h2>
158 - <% } else if (data[1] == '20220505') { %>
159 - <h2>1. 어린이날 즐기기.</h2>
160 - <h2>2. 놀이공원 </h2>
161 - <h2>3. 서울숲</h2>
162 - <% } else if (data[1] == '20220505') { %>
163 - <h2>1. 어린이날 즐기기.</h2>
164 - <h2>2. 놀이공원 </h2>
165 - <h2>3. 서울숲</h2>
166 - <% } else if (data[1] == '20220505') { %>
167 - <h2>1. 어린이날 즐기기.</h2>
168 - <h2>2. 놀이공원 </h2>
169 - <h2>3. 서울숲</h2>
...\ No newline at end of file ...\ No newline at end of file
1 -holi.json
2 -holi.xml
...\ No newline at end of file ...\ No newline at end of file
1 -../ejs/bin/cli.js
...\ No newline at end of file ...\ No newline at end of file
1 -../jake/bin/cli.js
...\ No newline at end of file ...\ No newline at end of file
1 -../mime/cli.js
...\ No newline at end of file ...\ No newline at end of file
1 -../sshpk/bin/sshpk-conv
...\ No newline at end of file ...\ No newline at end of file
1 -../sshpk/bin/sshpk-sign
...\ No newline at end of file ...\ No newline at end of file
1 -../sshpk/bin/sshpk-verify
...\ No newline at end of file ...\ No newline at end of file
1 -../uuid/bin/uuid
...\ No newline at end of file ...\ No newline at end of file
1 -../xml-js/bin/cli.js
...\ No newline at end of file ...\ No newline at end of file
This diff is collapsed. Click to expand it.
1 -1.3.8 / 2022-02-02
2 -==================
3 -
4 - * deps: mime-types@~2.1.34
5 - - deps: mime-db@~1.51.0
6 - * deps: negotiator@0.6.3
7 -
8 -1.3.7 / 2019-04-29
9 -==================
10 -
11 - * deps: negotiator@0.6.2
12 - - Fix sorting charset, encoding, and language with extra parameters
13 -
14 -1.3.6 / 2019-04-28
15 -==================
16 -
17 - * deps: mime-types@~2.1.24
18 - - deps: mime-db@~1.40.0
19 -
20 -1.3.5 / 2018-02-28
21 -==================
22 -
23 - * deps: mime-types@~2.1.18
24 - - deps: mime-db@~1.33.0
25 -
26 -1.3.4 / 2017-08-22
27 -==================
28 -
29 - * deps: mime-types@~2.1.16
30 - - deps: mime-db@~1.29.0
31 -
32 -1.3.3 / 2016-05-02
33 -==================
34 -
35 - * deps: mime-types@~2.1.11
36 - - deps: mime-db@~1.23.0
37 - * deps: negotiator@0.6.1
38 - - perf: improve `Accept` parsing speed
39 - - perf: improve `Accept-Charset` parsing speed
40 - - perf: improve `Accept-Encoding` parsing speed
41 - - perf: improve `Accept-Language` parsing speed
42 -
43 -1.3.2 / 2016-03-08
44 -==================
45 -
46 - * deps: mime-types@~2.1.10
47 - - Fix extension of `application/dash+xml`
48 - - Update primary extension for `audio/mp4`
49 - - deps: mime-db@~1.22.0
50 -
51 -1.3.1 / 2016-01-19
52 -==================
53 -
54 - * deps: mime-types@~2.1.9
55 - - deps: mime-db@~1.21.0
56 -
57 -1.3.0 / 2015-09-29
58 -==================
59 -
60 - * deps: mime-types@~2.1.7
61 - - deps: mime-db@~1.19.0
62 - * deps: negotiator@0.6.0
63 - - Fix including type extensions in parameters in `Accept` parsing
64 - - Fix parsing `Accept` parameters with quoted equals
65 - - Fix parsing `Accept` parameters with quoted semicolons
66 - - Lazy-load modules from main entry point
67 - - perf: delay type concatenation until needed
68 - - perf: enable strict mode
69 - - perf: hoist regular expressions
70 - - perf: remove closures getting spec properties
71 - - perf: remove a closure from media type parsing
72 - - perf: remove property delete from media type parsing
73 -
74 -1.2.13 / 2015-09-06
75 -===================
76 -
77 - * deps: mime-types@~2.1.6
78 - - deps: mime-db@~1.18.0
79 -
80 -1.2.12 / 2015-07-30
81 -===================
82 -
83 - * deps: mime-types@~2.1.4
84 - - deps: mime-db@~1.16.0
85 -
86 -1.2.11 / 2015-07-16
87 -===================
88 -
89 - * deps: mime-types@~2.1.3
90 - - deps: mime-db@~1.15.0
91 -
92 -1.2.10 / 2015-07-01
93 -===================
94 -
95 - * deps: mime-types@~2.1.2
96 - - deps: mime-db@~1.14.0
97 -
98 -1.2.9 / 2015-06-08
99 -==================
100 -
101 - * deps: mime-types@~2.1.1
102 - - perf: fix deopt during mapping
103 -
104 -1.2.8 / 2015-06-07
105 -==================
106 -
107 - * deps: mime-types@~2.1.0
108 - - deps: mime-db@~1.13.0
109 - * perf: avoid argument reassignment & argument slice
110 - * perf: avoid negotiator recursive construction
111 - * perf: enable strict mode
112 - * perf: remove unnecessary bitwise operator
113 -
114 -1.2.7 / 2015-05-10
115 -==================
116 -
117 - * deps: negotiator@0.5.3
118 - - Fix media type parameter matching to be case-insensitive
119 -
120 -1.2.6 / 2015-05-07
121 -==================
122 -
123 - * deps: mime-types@~2.0.11
124 - - deps: mime-db@~1.9.1
125 - * deps: negotiator@0.5.2
126 - - Fix comparing media types with quoted values
127 - - Fix splitting media types with quoted commas
128 -
129 -1.2.5 / 2015-03-13
130 -==================
131 -
132 - * deps: mime-types@~2.0.10
133 - - deps: mime-db@~1.8.0
134 -
135 -1.2.4 / 2015-02-14
136 -==================
137 -
138 - * Support Node.js 0.6
139 - * deps: mime-types@~2.0.9
140 - - deps: mime-db@~1.7.0
141 - * deps: negotiator@0.5.1
142 - - Fix preference sorting to be stable for long acceptable lists
143 -
144 -1.2.3 / 2015-01-31
145 -==================
146 -
147 - * deps: mime-types@~2.0.8
148 - - deps: mime-db@~1.6.0
149 -
150 -1.2.2 / 2014-12-30
151 -==================
152 -
153 - * deps: mime-types@~2.0.7
154 - - deps: mime-db@~1.5.0
155 -
156 -1.2.1 / 2014-12-30
157 -==================
158 -
159 - * deps: mime-types@~2.0.5
160 - - deps: mime-db@~1.3.1
161 -
162 -1.2.0 / 2014-12-19
163 -==================
164 -
165 - * deps: negotiator@0.5.0
166 - - Fix list return order when large accepted list
167 - - Fix missing identity encoding when q=0 exists
168 - - Remove dynamic building of Negotiator class
169 -
170 -1.1.4 / 2014-12-10
171 -==================
172 -
173 - * deps: mime-types@~2.0.4
174 - - deps: mime-db@~1.3.0
175 -
176 -1.1.3 / 2014-11-09
177 -==================
178 -
179 - * deps: mime-types@~2.0.3
180 - - deps: mime-db@~1.2.0
181 -
182 -1.1.2 / 2014-10-14
183 -==================
184 -
185 - * deps: negotiator@0.4.9
186 - - Fix error when media type has invalid parameter
187 -
188 -1.1.1 / 2014-09-28
189 -==================
190 -
191 - * deps: mime-types@~2.0.2
192 - - deps: mime-db@~1.1.0
193 - * deps: negotiator@0.4.8
194 - - Fix all negotiations to be case-insensitive
195 - - Stable sort preferences of same quality according to client order
196 -
197 -1.1.0 / 2014-09-02
198 -==================
199 -
200 - * update `mime-types`
201 -
202 -1.0.7 / 2014-07-04
203 -==================
204 -
205 - * Fix wrong type returned from `type` when match after unknown extension
206 -
207 -1.0.6 / 2014-06-24
208 -==================
209 -
210 - * deps: negotiator@0.4.7
211 -
212 -1.0.5 / 2014-06-20
213 -==================
214 -
215 - * fix crash when unknown extension given
216 -
217 -1.0.4 / 2014-06-19
218 -==================
219 -
220 - * use `mime-types`
221 -
222 -1.0.3 / 2014-06-11
223 -==================
224 -
225 - * deps: negotiator@0.4.6
226 - - Order by specificity when quality is the same
227 -
228 -1.0.2 / 2014-05-29
229 -==================
230 -
231 - * Fix interpretation when header not in request
232 - * deps: pin negotiator@0.4.5
233 -
234 -1.0.1 / 2014-01-18
235 -==================
236 -
237 - * Identity encoding isn't always acceptable
238 - * deps: negotiator@~0.4.0
239 -
240 -1.0.0 / 2013-12-27
241 -==================
242 -
243 - * Genesis
1 -(The MIT License)
2 -
3 -Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
4 -Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
5 -
6 -Permission is hereby granted, free of charge, to any person obtaining
7 -a copy of this software and associated documentation files (the
8 -'Software'), to deal in the Software without restriction, including
9 -without limitation the rights to use, copy, modify, merge, publish,
10 -distribute, sublicense, and/or sell copies of the Software, and to
11 -permit persons to whom the Software is furnished to do so, subject to
12 -the following conditions:
13 -
14 -The above copyright notice and this permission notice shall be
15 -included in all copies or substantial portions of the Software.
16 -
17 -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18 -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1 -# accepts
2 -
3 -[![NPM Version][npm-version-image]][npm-url]
4 -[![NPM Downloads][npm-downloads-image]][npm-url]
5 -[![Node.js Version][node-version-image]][node-version-url]
6 -[![Build Status][github-actions-ci-image]][github-actions-ci-url]
7 -[![Test Coverage][coveralls-image]][coveralls-url]
8 -
9 -Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
10 -Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
11 -
12 -In addition to negotiator, it allows:
13 -
14 -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
15 - as well as `('text/html', 'application/json')`.
16 -- Allows type shorthands such as `json`.
17 -- Returns `false` when no types match
18 -- Treats non-existent headers as `*`
19 -
20 -## Installation
21 -
22 -This is a [Node.js](https://nodejs.org/en/) module available through the
23 -[npm registry](https://www.npmjs.com/). Installation is done using the
24 -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
25 -
26 -```sh
27 -$ npm install accepts
28 -```
29 -
30 -## API
31 -
32 -```js
33 -var accepts = require('accepts')
34 -```
35 -
36 -### accepts(req)
37 -
38 -Create a new `Accepts` object for the given `req`.
39 -
40 -#### .charset(charsets)
41 -
42 -Return the first accepted charset. If nothing in `charsets` is accepted,
43 -then `false` is returned.
44 -
45 -#### .charsets()
46 -
47 -Return the charsets that the request accepts, in the order of the client's
48 -preference (most preferred first).
49 -
50 -#### .encoding(encodings)
51 -
52 -Return the first accepted encoding. If nothing in `encodings` is accepted,
53 -then `false` is returned.
54 -
55 -#### .encodings()
56 -
57 -Return the encodings that the request accepts, in the order of the client's
58 -preference (most preferred first).
59 -
60 -#### .language(languages)
61 -
62 -Return the first accepted language. If nothing in `languages` is accepted,
63 -then `false` is returned.
64 -
65 -#### .languages()
66 -
67 -Return the languages that the request accepts, in the order of the client's
68 -preference (most preferred first).
69 -
70 -#### .type(types)
71 -
72 -Return the first accepted type (and it is returned as the same text as what
73 -appears in the `types` array). If nothing in `types` is accepted, then `false`
74 -is returned.
75 -
76 -The `types` array can contain full MIME types or file extensions. Any value
77 -that is not a full MIME types is passed to `require('mime-types').lookup`.
78 -
79 -#### .types()
80 -
81 -Return the types that the request accepts, in the order of the client's
82 -preference (most preferred first).
83 -
84 -## Examples
85 -
86 -### Simple type negotiation
87 -
88 -This simple example shows how to use `accepts` to return a different typed
89 -respond body based on what the client wants to accept. The server lists it's
90 -preferences in order and will get back the best match between the client and
91 -server.
92 -
93 -```js
94 -var accepts = require('accepts')
95 -var http = require('http')
96 -
97 -function app (req, res) {
98 - var accept = accepts(req)
99 -
100 - // the order of this list is significant; should be server preferred order
101 - switch (accept.type(['json', 'html'])) {
102 - case 'json':
103 - res.setHeader('Content-Type', 'application/json')
104 - res.write('{"hello":"world!"}')
105 - break
106 - case 'html':
107 - res.setHeader('Content-Type', 'text/html')
108 - res.write('<b>hello, world!</b>')
109 - break
110 - default:
111 - // the fallback is text/plain, so no need to specify it above
112 - res.setHeader('Content-Type', 'text/plain')
113 - res.write('hello, world!')
114 - break
115 - }
116 -
117 - res.end()
118 -}
119 -
120 -http.createServer(app).listen(3000)
121 -```
122 -
123 -You can test this out with the cURL program:
124 -```sh
125 -curl -I -H'Accept: text/html' http://localhost:3000/
126 -```
127 -
128 -## License
129 -
130 -[MIT](LICENSE)
131 -
132 -[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
133 -[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
134 -[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci
135 -[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml
136 -[node-version-image]: https://badgen.net/npm/node/accepts
137 -[node-version-url]: https://nodejs.org/en/download
138 -[npm-downloads-image]: https://badgen.net/npm/dm/accepts
139 -[npm-url]: https://npmjs.org/package/accepts
140 -[npm-version-image]: https://badgen.net/npm/v/accepts
1 -/*!
2 - * accepts
3 - * Copyright(c) 2014 Jonathan Ong
4 - * Copyright(c) 2015 Douglas Christopher Wilson
5 - * MIT Licensed
6 - */
7 -
8 -'use strict'
9 -
10 -/**
11 - * Module dependencies.
12 - * @private
13 - */
14 -
15 -var Negotiator = require('negotiator')
16 -var mime = require('mime-types')
17 -
18 -/**
19 - * Module exports.
20 - * @public
21 - */
22 -
23 -module.exports = Accepts
24 -
25 -/**
26 - * Create a new Accepts object for the given req.
27 - *
28 - * @param {object} req
29 - * @public
30 - */
31 -
32 -function Accepts (req) {
33 - if (!(this instanceof Accepts)) {
34 - return new Accepts(req)
35 - }
36 -
37 - this.headers = req.headers
38 - this.negotiator = new Negotiator(req)
39 -}
40 -
41 -/**
42 - * Check if the given `type(s)` is acceptable, returning
43 - * the best match when true, otherwise `undefined`, in which
44 - * case you should respond with 406 "Not Acceptable".
45 - *
46 - * The `type` value may be a single mime type string
47 - * such as "application/json", the extension name
48 - * such as "json" or an array `["json", "html", "text/plain"]`. When a list
49 - * or array is given the _best_ match, if any is returned.
50 - *
51 - * Examples:
52 - *
53 - * // Accept: text/html
54 - * this.types('html');
55 - * // => "html"
56 - *
57 - * // Accept: text/*, application/json
58 - * this.types('html');
59 - * // => "html"
60 - * this.types('text/html');
61 - * // => "text/html"
62 - * this.types('json', 'text');
63 - * // => "json"
64 - * this.types('application/json');
65 - * // => "application/json"
66 - *
67 - * // Accept: text/*, application/json
68 - * this.types('image/png');
69 - * this.types('png');
70 - * // => undefined
71 - *
72 - * // Accept: text/*;q=.5, application/json
73 - * this.types(['html', 'json']);
74 - * this.types('html', 'json');
75 - * // => "json"
76 - *
77 - * @param {String|Array} types...
78 - * @return {String|Array|Boolean}
79 - * @public
80 - */
81 -
82 -Accepts.prototype.type =
83 -Accepts.prototype.types = function (types_) {
84 - var types = types_
85 -
86 - // support flattened arguments
87 - if (types && !Array.isArray(types)) {
88 - types = new Array(arguments.length)
89 - for (var i = 0; i < types.length; i++) {
90 - types[i] = arguments[i]
91 - }
92 - }
93 -
94 - // no types, return all requested types
95 - if (!types || types.length === 0) {
96 - return this.negotiator.mediaTypes()
97 - }
98 -
99 - // no accept header, return first given type
100 - if (!this.headers.accept) {
101 - return types[0]
102 - }
103 -
104 - var mimes = types.map(extToMime)
105 - var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
106 - var first = accepts[0]
107 -
108 - return first
109 - ? types[mimes.indexOf(first)]
110 - : false
111 -}
112 -
113 -/**
114 - * Return accepted encodings or best fit based on `encodings`.
115 - *
116 - * Given `Accept-Encoding: gzip, deflate`
117 - * an array sorted by quality is returned:
118 - *
119 - * ['gzip', 'deflate']
120 - *
121 - * @param {String|Array} encodings...
122 - * @return {String|Array}
123 - * @public
124 - */
125 -
126 -Accepts.prototype.encoding =
127 -Accepts.prototype.encodings = function (encodings_) {
128 - var encodings = encodings_
129 -
130 - // support flattened arguments
131 - if (encodings && !Array.isArray(encodings)) {
132 - encodings = new Array(arguments.length)
133 - for (var i = 0; i < encodings.length; i++) {
134 - encodings[i] = arguments[i]
135 - }
136 - }
137 -
138 - // no encodings, return all requested encodings
139 - if (!encodings || encodings.length === 0) {
140 - return this.negotiator.encodings()
141 - }
142 -
143 - return this.negotiator.encodings(encodings)[0] || false
144 -}
145 -
146 -/**
147 - * Return accepted charsets or best fit based on `charsets`.
148 - *
149 - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
150 - * an array sorted by quality is returned:
151 - *
152 - * ['utf-8', 'utf-7', 'iso-8859-1']
153 - *
154 - * @param {String|Array} charsets...
155 - * @return {String|Array}
156 - * @public
157 - */
158 -
159 -Accepts.prototype.charset =
160 -Accepts.prototype.charsets = function (charsets_) {
161 - var charsets = charsets_
162 -
163 - // support flattened arguments
164 - if (charsets && !Array.isArray(charsets)) {
165 - charsets = new Array(arguments.length)
166 - for (var i = 0; i < charsets.length; i++) {
167 - charsets[i] = arguments[i]
168 - }
169 - }
170 -
171 - // no charsets, return all requested charsets
172 - if (!charsets || charsets.length === 0) {
173 - return this.negotiator.charsets()
174 - }
175 -
176 - return this.negotiator.charsets(charsets)[0] || false
177 -}
178 -
179 -/**
180 - * Return accepted languages or best fit based on `langs`.
181 - *
182 - * Given `Accept-Language: en;q=0.8, es, pt`
183 - * an array sorted by quality is returned:
184 - *
185 - * ['es', 'pt', 'en']
186 - *
187 - * @param {String|Array} langs...
188 - * @return {Array|String}
189 - * @public
190 - */
191 -
192 -Accepts.prototype.lang =
193 -Accepts.prototype.langs =
194 -Accepts.prototype.language =
195 -Accepts.prototype.languages = function (languages_) {
196 - var languages = languages_
197 -
198 - // support flattened arguments
199 - if (languages && !Array.isArray(languages)) {
200 - languages = new Array(arguments.length)
201 - for (var i = 0; i < languages.length; i++) {
202 - languages[i] = arguments[i]
203 - }
204 - }
205 -
206 - // no languages, return all requested languages
207 - if (!languages || languages.length === 0) {
208 - return this.negotiator.languages()
209 - }
210 -
211 - return this.negotiator.languages(languages)[0] || false
212 -}
213 -
214 -/**
215 - * Convert extnames to mime.
216 - *
217 - * @param {String} type
218 - * @return {String}
219 - * @private
220 - */
221 -
222 -function extToMime (type) {
223 - return type.indexOf('/') === -1
224 - ? mime.lookup(type)
225 - : type
226 -}
227 -
228 -/**
229 - * Check if mime is valid.
230 - *
231 - * @param {String} type
232 - * @return {String}
233 - * @private
234 - */
235 -
236 -function validMime (type) {
237 - return typeof type === 'string'
238 -}
1 -{
2 - "name": "accepts",
3 - "description": "Higher-level content negotiation",
4 - "version": "1.3.8",
5 - "contributors": [
6 - "Douglas Christopher Wilson <doug@somethingdoug.com>",
7 - "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
8 - ],
9 - "license": "MIT",
10 - "repository": "jshttp/accepts",
11 - "dependencies": {
12 - "mime-types": "~2.1.34",
13 - "negotiator": "0.6.3"
14 - },
15 - "devDependencies": {
16 - "deep-equal": "1.0.1",
17 - "eslint": "7.32.0",
18 - "eslint-config-standard": "14.1.1",
19 - "eslint-plugin-import": "2.25.4",
20 - "eslint-plugin-markdown": "2.2.1",
21 - "eslint-plugin-node": "11.1.0",
22 - "eslint-plugin-promise": "4.3.1",
23 - "eslint-plugin-standard": "4.1.0",
24 - "mocha": "9.2.0",
25 - "nyc": "15.1.0"
26 - },
27 - "files": [
28 - "LICENSE",
29 - "HISTORY.md",
30 - "index.js"
31 - ],
32 - "engines": {
33 - "node": ">= 0.6"
34 - },
35 - "scripts": {
36 - "lint": "eslint .",
37 - "test": "mocha --reporter spec --check-leaks --bail test/",
38 - "test-ci": "nyc --reporter=lcov --reporter=text npm test",
39 - "test-cov": "nyc --reporter=html --reporter=text npm test"
40 - },
41 - "keywords": [
42 - "content",
43 - "negotiation",
44 - "accept",
45 - "accepts"
46 - ]
47 -}
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 -}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff 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 is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff 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 is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff 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 is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff 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.