11"use strict" ;
2+ var validations_1 = require ( './validations' ) ;
23var validKeys = {
34 info : [ 'title' , 'description' ] ,
45 page : [ 'title' , 'description' , 'onPageComplete' , 'tasks' , 'video' , 'link' ] ,
56 task : [ 'description' , 'tests' , 'actions' , 'hints' ] ,
67 actions : [ 'open' , 'set' , 'insert' ] ,
78} ;
9+ var validateKeys = {
10+ info : [ {
11+ name : 'title' ,
12+ validation : validations_1 . isString ,
13+ } , {
14+ name : 'description' ,
15+ validation : validations_1 . isString ,
16+ } ] ,
17+ page : [ {
18+ name : 'title' ,
19+ validation : validations_1 . isString ,
20+ } , {
21+ name : 'description' ,
22+ validation : validations_1 . isString ,
23+ } ] ,
24+ task : [ {
25+ name : 'description' ,
26+ validation : validations_1 . isString ,
27+ } , {
28+ name : 'tests' ,
29+ validation : function ( tests ) { return Array . isArray ( tests ) && tests . length && tests . every ( function ( test ) { return typeof test === 'string' && test . length ; } ) ; } ,
30+ } ]
31+ } ;
832function validateCoderoadJson ( json ) {
933 var errors = [ ] ;
1034 var warnings = [ ] ;
1135 try {
12- json . parse ( json ) ;
36+ JSON . parse ( JSON . stringify ( json ) ) ;
1337 }
1438 catch ( e ) {
1539 errors . push ( {
16- name : 'json' ,
17- msg : 'is invalid '
40+ name : 'coderoad. json' ,
41+ msg : 'has an error. '
1842 } ) ;
1943 return {
2044 errors : errors , warnings : warnings
2145 } ;
2246 }
2347 var infoKeys = Object . keys ( json . info ) ;
2448 infoKeys . forEach ( function ( key ) {
25- if ( validKeys . info . indexOf ( key ) < 0 ) {
49+ if ( ! validKeys . info . includes ( key ) ) {
2650 errors . push ( {
27- name : key ,
28- msg : 'is missing ' ,
51+ name : "info." + key ,
52+ msg : 'is not a valid key on info ' ,
2953 location : "info." + key ,
54+ example : "Did you mean: " + validKeys . info . join ( ', ' )
55+ } ) ;
56+ }
57+ } ) ;
58+ validateKeys . info . forEach ( function ( key ) {
59+ if ( ! key . validation ( json . info [ key . name ] ) ) {
60+ errors . push ( {
61+ name : "info." + key . name ,
62+ msg : 'is not complete' ,
63+ example : "Expected a string, but got: " + json . info [ key . name ] ,
3064 } ) ;
3165 }
3266 } ) ;
@@ -42,6 +76,15 @@ function validateCoderoadJson(json) {
4276 } ) ;
4377 }
4478 } ) ;
79+ validateKeys . page . forEach ( function ( key ) {
80+ if ( ! key . validation ( page [ key . name ] ) ) {
81+ errors . push ( {
82+ name : "pages[" + pIndex + "]." + key . name ,
83+ msg : 'is not complete' ,
84+ example : "Expected a string, but got: " + page [ key . name ]
85+ } ) ;
86+ }
87+ } ) ;
4588 if ( page . tasks && page . tasks . length > 0 ) {
4689 page . tasks . forEach ( function ( task , tIndex ) {
4790 var taskKeys = Object . keys ( task ) ;
@@ -61,6 +104,15 @@ function validateCoderoadJson(json) {
61104 location : "pages[" + pIndex + "].tasks[" + tIndex + "]" ,
62105 } ) ;
63106 }
107+ validateKeys . task . forEach ( function ( key ) {
108+ if ( ! key . validation ( task [ key . name ] ) ) {
109+ errors . push ( {
110+ name : "pages[" + pIndex + "].tasks[" + tIndex + "]." + key . name ,
111+ msg : 'is not complete' ,
112+ example : "Expected a string, but got: " + page [ key . name ]
113+ } ) ;
114+ }
115+ } ) ;
64116 } ) ;
65117 }
66118 else {
0 commit comments