blaze_compiler
Advanced tools
Comparing version 0.0.14 to 0.0.15
@@ -9,50 +9,19 @@ { | ||
"$userid": { | ||
".write":"true&&true&&false&&true&&false&&(false||false)", | ||
".read":"false||$userid===auth.username", | ||
"inbox": { | ||
".write":"true&&false&&(false||newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username||false)", | ||
".read":"false||false||false||$userid===auth.username", | ||
"$message": { | ||
".write":"true&&true&&(!newData.child('from').parent().parent().parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().parent().parent().isString()||newData.child('from').parent().parent().parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().parent().isString()||newData.child('from').parent().parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().isString()||newData.child('from').parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().exists()||!(newData.child('from').parent().parent().isString()||newData.child('from').parent().parent().isNumber()||newData.child('from').parent().parent().isBoolean()))&&(newData.child('from').parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().exists()||!(newData.child('from').parent().isString()||newData.child('from').parent().isNumber()||newData.child('from').parent().isBoolean()))&&(newData.child('from').parent().val()==null||true&&newData.child('from').parent().child('from').exists()&&newData.child('from').parent().child('to').exists()&&newData.child('from').parent().child('message').exists())&&(auth.username==newData.child('from').val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.child('from').exists()||newData.child('from').isString())&&true&&(!newData.child('to').parent().parent().parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().parent().parent().isString()||newData.child('to').parent().parent().parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().parent().isString()||newData.child('to').parent().parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().isString()||newData.child('to').parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().exists()||!(newData.child('to').parent().parent().isString()||newData.child('to').parent().parent().isNumber()||newData.child('to').parent().parent().isBoolean()))&&(newData.child('to').parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().exists()||!(newData.child('to').parent().isString()||newData.child('to').parent().isNumber()||newData.child('to').parent().isBoolean()))&&(newData.child('to').parent().val()==null||true&&newData.child('to').parent().child('from').exists()&&newData.child('to').parent().child('to').exists()&&newData.child('to').parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('to').exists()||newData.child('to').isString())&&true&&(!newData.child('message').parent().parent().parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().parent().parent().isString()||newData.child('message').parent().parent().parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().parent().isString()||newData.child('message').parent().parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().isString()||newData.child('message').parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().exists()||!(newData.child('message').parent().parent().isString()||newData.child('message').parent().parent().isNumber()||newData.child('message').parent().parent().isBoolean()))&&(newData.child('message').parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().exists()||!(newData.child('message').parent().isString()||newData.child('message').parent().isNumber()||newData.child('message').parent().isBoolean()))&&(newData.child('message').parent().val()==null||true&&newData.child('message').parent().child('from').exists()&&newData.child('message').parent().child('to').exists()&&newData.child('message').parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('message').exists()||newData.child('message').isString())&&(false||newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username||false)", | ||
".read":"false||false||false||$userid===auth.username", | ||
"from": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(auth.username==newData.val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username||false)", | ||
".read":"false||false||false||$userid===auth.username" | ||
}, | ||
"to": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username||false)", | ||
".read":"false||false||false||$userid===auth.username" | ||
}, | ||
"message": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username||false)", | ||
".read":"false||false||false||$userid===auth.username" | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
".write":"true&&true&&(!newData.child('name').parent().parent().parent().exists()||!(newData.child('name').parent().parent().parent().isString()||newData.child('name').parent().parent().parent().isNumber()||newData.child('name').parent().parent().parent().isBoolean()))&&(newData.child('name').parent().parent().parent().val()==null||true)&&true&&(!newData.child('name').parent().parent().exists()||!(newData.child('name').parent().parent().isString()||newData.child('name').parent().parent().isNumber()||newData.child('name').parent().parent().isBoolean()))&&(newData.child('name').parent().parent().val()==null||true)&&true&&(!newData.child('name').parent().exists()||!(newData.child('name').parent().isString()||newData.child('name').parent().isNumber()||newData.child('name').parent().isBoolean()))&&(newData.child('name').parent().val()==null||true)&&true&&(!newData.child('name').exists()||newData.child('name').isString())&&true&&(!newData.child('highscore').parent().parent().parent().exists()||!(newData.child('highscore').parent().parent().parent().isString()||newData.child('highscore').parent().parent().parent().isNumber()||newData.child('highscore').parent().parent().parent().isBoolean()))&&(newData.child('highscore').parent().parent().parent().val()==null||true)&&true&&(!newData.child('highscore').parent().parent().exists()||!(newData.child('highscore').parent().parent().isString()||newData.child('highscore').parent().parent().isNumber()||newData.child('highscore').parent().parent().isBoolean()))&&(newData.child('highscore').parent().parent().val()==null||true)&&true&&(!newData.child('highscore').parent().exists()||!(newData.child('highscore').parent().isString()||newData.child('highscore').parent().isNumber()||newData.child('highscore').parent().isBoolean()))&&(newData.child('highscore').parent().val()==null||true)&&(data.child('highscore').val()==newData.child('highscore').val()||newData.child('highscore').val()==newData.child('highscore').parent().child('lastscore').val())&&true&&(!newData.child('lastscore').parent().parent().parent().exists()||!(newData.child('lastscore').parent().parent().parent().isString()||newData.child('lastscore').parent().parent().parent().isNumber()||newData.child('lastscore').parent().parent().parent().isBoolean()))&&(newData.child('lastscore').parent().parent().parent().val()==null||true)&&true&&(!newData.child('lastscore').parent().parent().exists()||!(newData.child('lastscore').parent().parent().isString()||newData.child('lastscore').parent().parent().isNumber()||newData.child('lastscore').parent().parent().isBoolean()))&&(newData.child('lastscore').parent().parent().val()==null||true)&&true&&(!newData.child('lastscore').parent().exists()||!(newData.child('lastscore').parent().isString()||newData.child('lastscore').parent().isNumber()||newData.child('lastscore').parent().isBoolean()))&&(newData.child('lastscore').parent().val()==null||true)&&true&&(!newData.child('lastscore').exists()||newData.child('lastscore').isNumber())&&(false||false)", | ||
".read":"false||auth!=null", | ||
"name": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true)&&true&&(!newData.exists()||newData.isString())&&(false||false||auth.id===$userid)", | ||
".read":"false||auth!=null||false" | ||
}, | ||
"outbox": { | ||
".write":"true&&false&&(false||true||false)", | ||
".read":"false||false||$userid===auth.username", | ||
"$message": { | ||
".write":"true&&true&&(!newData.child('from').parent().parent().parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().parent().parent().isString()||newData.child('from').parent().parent().parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().parent().isString()||newData.child('from').parent().parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().parent().exists()||!(newData.child('from').parent().parent().parent().isString()||newData.child('from').parent().parent().parent().isNumber()||newData.child('from').parent().parent().parent().isBoolean()))&&(newData.child('from').parent().parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().parent().exists()||!(newData.child('from').parent().parent().isString()||newData.child('from').parent().parent().isNumber()||newData.child('from').parent().parent().isBoolean()))&&(newData.child('from').parent().parent().val()==null||true)&&true&&(!newData.child('from').parent().exists()||!(newData.child('from').parent().isString()||newData.child('from').parent().isNumber()||newData.child('from').parent().isBoolean()))&&(newData.child('from').parent().val()==null||true&&newData.child('from').parent().child('from').exists()&&newData.child('from').parent().child('to').exists()&&newData.child('from').parent().child('message').exists())&&(!newData.child('from').parent().exists()||!(newData.child('from').parent().isString()||newData.child('from').parent().isNumber()||newData.child('from').parent().isBoolean()))&&(newData.child('from').parent().val()==null||true&&newData.child('from').parent().child('from').exists()&&newData.child('from').parent().child('to').exists()&&newData.child('from').parent().child('message').exists())&&(auth.username==newData.child('from').val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.child('from').exists()||newData.child('from').isString())&&(!newData.child('from').exists()||newData.child('from').isString())&&true&&(!newData.child('to').parent().parent().parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().parent().parent().isString()||newData.child('to').parent().parent().parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().parent().isString()||newData.child('to').parent().parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().parent().exists()||!(newData.child('to').parent().parent().parent().isString()||newData.child('to').parent().parent().parent().isNumber()||newData.child('to').parent().parent().parent().isBoolean()))&&(newData.child('to').parent().parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().parent().exists()||!(newData.child('to').parent().parent().isString()||newData.child('to').parent().parent().isNumber()||newData.child('to').parent().parent().isBoolean()))&&(newData.child('to').parent().parent().val()==null||true)&&true&&(!newData.child('to').parent().exists()||!(newData.child('to').parent().isString()||newData.child('to').parent().isNumber()||newData.child('to').parent().isBoolean()))&&(newData.child('to').parent().val()==null||true&&newData.child('to').parent().child('from').exists()&&newData.child('to').parent().child('to').exists()&&newData.child('to').parent().child('message').exists())&&(!newData.child('to').parent().exists()||!(newData.child('to').parent().isString()||newData.child('to').parent().isNumber()||newData.child('to').parent().isBoolean()))&&(newData.child('to').parent().val()==null||true&&newData.child('to').parent().child('from').exists()&&newData.child('to').parent().child('to').exists()&&newData.child('to').parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('to').exists()||newData.child('to').isString())&&(!newData.child('to').exists()||newData.child('to').isString())&&true&&(!newData.child('message').parent().parent().parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().parent().parent().isString()||newData.child('message').parent().parent().parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().parent().isString()||newData.child('message').parent().parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().parent().exists()||!(newData.child('message').parent().parent().parent().isString()||newData.child('message').parent().parent().parent().isNumber()||newData.child('message').parent().parent().parent().isBoolean()))&&(newData.child('message').parent().parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().parent().exists()||!(newData.child('message').parent().parent().isString()||newData.child('message').parent().parent().isNumber()||newData.child('message').parent().parent().isBoolean()))&&(newData.child('message').parent().parent().val()==null||true)&&true&&(!newData.child('message').parent().exists()||!(newData.child('message').parent().isString()||newData.child('message').parent().isNumber()||newData.child('message').parent().isBoolean()))&&(newData.child('message').parent().val()==null||true&&newData.child('message').parent().child('from').exists()&&newData.child('message').parent().child('to').exists()&&newData.child('message').parent().child('message').exists())&&(!newData.child('message').parent().exists()||!(newData.child('message').parent().isString()||newData.child('message').parent().isNumber()||newData.child('message').parent().isBoolean()))&&(newData.child('message').parent().val()==null||true&&newData.child('message').parent().child('from').exists()&&newData.child('message').parent().child('to').exists()&&newData.child('message').parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('message').exists()||newData.child('message').isString())&&(!newData.child('message').exists()||newData.child('message').isString())&&(false||true||false)", | ||
".read":"false||false||$userid===auth.username", | ||
"from": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(auth.username==newData.val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(!newData.exists()||newData.isString())&&(false||true||false)", | ||
".read":"false||false||$userid===auth.username" | ||
}, | ||
"to": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(!newData.exists()||newData.isString())&&(false||true||false)", | ||
".read":"false||false||$userid===auth.username" | ||
}, | ||
"message": { | ||
".write":"true&&(!newData.parent().parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().parent().exists()||!(newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(!newData.exists()||newData.isString())&&(false||true||false)", | ||
".read":"false||false||$userid===auth.username" | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
"highscore": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true)&&(data.val()==newData.val()||newData.val()==newData.parent().child('lastscore').val())&&(false||false||true)", | ||
".read":"false||auth!=null||false" | ||
}, | ||
"lastscore": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true)&&true&&(!newData.exists()||newData.isNumber())&&(false||false||auth.server==true)", | ||
".read":"false||auth!=null||false" | ||
} | ||
} | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
} | ||
} |
{ | ||
"name": "blaze_compiler", | ||
"version": "0.0.14", | ||
"version": "0.0.15", | ||
"description": "Transpiles extendable, schema orientated definitions into Firebase security rules", | ||
@@ -5,0 +5,0 @@ "author": "Tom Larkworthy", |
105
rules.json
{ | ||
"rules":{ | ||
".write":"true&&true&&false&&true&&false&&false", | ||
".write":"false", | ||
".read":"false", | ||
"queue": { | ||
".write":"true&&false&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false", | ||
"$bookingid": { | ||
".write":"true&&true&&(!newData.child('apikey').parent().parent().parent().exists()||!(newData.child('apikey').parent().parent().parent().isString()||newData.child('apikey').parent().parent().parent().isNumber()||newData.child('apikey').parent().parent().parent().isBoolean()))&&(newData.child('apikey').parent().parent().parent().val()==null||true)&&true&&(!newData.child('apikey').parent().parent().exists()||!(newData.child('apikey').parent().parent().isString()||newData.child('apikey').parent().parent().isNumber()||newData.child('apikey').parent().parent().isBoolean()))&&(newData.child('apikey').parent().parent().val()==null||true)&&true&&(!newData.child('apikey').parent().exists()||!(newData.child('apikey').parent().isString()||newData.child('apikey').parent().isNumber()||newData.child('apikey').parent().isBoolean()))&&(newData.child('apikey').parent().val()==null||true&&newData.child('apikey').parent().child('apikey').exists()&&newData.child('apikey').parent().child('phone').exists()&&newData.child('apikey').parent().child('date').exists()&&newData.child('apikey').parent().child('time').exists()&&newData.child('apikey').parent().child('data').exists())&&true&&(!newData.child('apikey').exists()||newData.child('apikey').isString())&&true&&(!newData.child('date').parent().parent().parent().exists()||!(newData.child('date').parent().parent().parent().isString()||newData.child('date').parent().parent().parent().isNumber()||newData.child('date').parent().parent().parent().isBoolean()))&&(newData.child('date').parent().parent().parent().val()==null||true)&&true&&(!newData.child('date').parent().parent().exists()||!(newData.child('date').parent().parent().isString()||newData.child('date').parent().parent().isNumber()||newData.child('date').parent().parent().isBoolean()))&&(newData.child('date').parent().parent().val()==null||true)&&true&&(!newData.child('date').parent().exists()||!(newData.child('date').parent().isString()||newData.child('date').parent().isNumber()||newData.child('date').parent().isBoolean()))&&(newData.child('date').parent().val()==null||true&&newData.child('date').parent().child('apikey').exists()&&newData.child('date').parent().child('phone').exists()&&newData.child('date').parent().child('date').exists()&&newData.child('date').parent().child('time').exists()&&newData.child('date').parent().child('data').exists())&&true&&(!newData.child('date').exists()||newData.child('date').isString())&&true&&(!newData.child('phone').parent().parent().parent().exists()||!(newData.child('phone').parent().parent().parent().isString()||newData.child('phone').parent().parent().parent().isNumber()||newData.child('phone').parent().parent().parent().isBoolean()))&&(newData.child('phone').parent().parent().parent().val()==null||true)&&true&&(!newData.child('phone').parent().parent().exists()||!(newData.child('phone').parent().parent().isString()||newData.child('phone').parent().parent().isNumber()||newData.child('phone').parent().parent().isBoolean()))&&(newData.child('phone').parent().parent().val()==null||true)&&true&&(!newData.child('phone').parent().exists()||!(newData.child('phone').parent().isString()||newData.child('phone').parent().isNumber()||newData.child('phone').parent().isBoolean()))&&(newData.child('phone').parent().val()==null||true&&newData.child('phone').parent().child('apikey').exists()&&newData.child('phone').parent().child('phone').exists()&&newData.child('phone').parent().child('date').exists()&&newData.child('phone').parent().child('time').exists()&&newData.child('phone').parent().child('data').exists())&&true&&(!newData.child('phone').exists()||newData.child('phone').isString())&&true&&(!newData.child('time').parent().parent().parent().exists()||!(newData.child('time').parent().parent().parent().isString()||newData.child('time').parent().parent().parent().isNumber()||newData.child('time').parent().parent().parent().isBoolean()))&&(newData.child('time').parent().parent().parent().val()==null||true)&&true&&(!newData.child('time').parent().parent().exists()||!(newData.child('time').parent().parent().isString()||newData.child('time').parent().parent().isNumber()||newData.child('time').parent().parent().isBoolean()))&&(newData.child('time').parent().parent().val()==null||true)&&true&&(!newData.child('time').parent().exists()||!(newData.child('time').parent().isString()||newData.child('time').parent().isNumber()||newData.child('time').parent().isBoolean()))&&(newData.child('time').parent().val()==null||true&&newData.child('time').parent().child('apikey').exists()&&newData.child('time').parent().child('phone').exists()&&newData.child('time').parent().child('date').exists()&&newData.child('time').parent().child('time').exists()&&newData.child('time').parent().child('data').exists())&&true&&(!newData.child('time').exists()||newData.child('time').isString())&&true&&(!newData.child('data').parent().parent().parent().exists()||!(newData.child('data').parent().parent().parent().isString()||newData.child('data').parent().parent().parent().isNumber()||newData.child('data').parent().parent().parent().isBoolean()))&&(newData.child('data').parent().parent().parent().val()==null||true)&&true&&(!newData.child('data').parent().parent().exists()||!(newData.child('data').parent().parent().isString()||newData.child('data').parent().parent().isNumber()||newData.child('data').parent().parent().isBoolean()))&&(newData.child('data').parent().parent().val()==null||true)&&true&&(!newData.child('data').parent().exists()||!(newData.child('data').parent().isString()||newData.child('data').parent().isNumber()||newData.child('data').parent().isBoolean()))&&(newData.child('data').parent().val()==null||true&&newData.child('data').parent().child('apikey').exists()&&newData.child('data').parent().child('phone').exists()&&newData.child('data').parent().child('date').exists()&&newData.child('data').parent().child('time').exists()&&newData.child('data').parent().child('data').exists())&&true&&(!newData.child('data').exists()||!(newData.child('data').isString()||newData.child('data').isNumber()||newData.child('data').isBoolean()))&&(newData.child('data').val()==null||true)&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false", | ||
"apikey": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('date').exists()&&newData.parent().child('time').exists()&&newData.parent().child('data').exists())&&true&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false" | ||
}, | ||
"date": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('date').exists()&&newData.parent().child('time').exists()&&newData.parent().child('data').exists())&&true&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false" | ||
}, | ||
"phone": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('date').exists()&&newData.parent().child('time').exists()&&newData.parent().child('data').exists())&&true&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false" | ||
}, | ||
"time": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('date').exists()&&newData.parent().child('time').exists()&&newData.parent().child('data').exists())&&true&&(!newData.exists()||newData.isString())&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false" | ||
}, | ||
"data": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('date').exists()&&newData.parent().child('time').exists()&&newData.parent().child('data').exists())&&true&&(!newData.exists()||!(newData.isString()||newData.isNumber()||newData.isBoolean()))&&(newData.val()==null||true)&&(false||newData.exists()&&!data.exists())", | ||
".read":"false||false" | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
}, | ||
"users": { | ||
".write":"true&&false&&false", | ||
".write":"false", | ||
".read":"false", | ||
"$userid": { | ||
".write":"true&&true&&(!newData.child('apikey').parent().parent().parent().exists()||!(newData.child('apikey').parent().parent().parent().isString()||newData.child('apikey').parent().parent().parent().isNumber()||newData.child('apikey').parent().parent().parent().isBoolean()))&&(newData.child('apikey').parent().parent().parent().val()==null||true)&&true&&(!newData.child('apikey').parent().parent().exists()||!(newData.child('apikey').parent().parent().isString()||newData.child('apikey').parent().parent().isNumber()||newData.child('apikey').parent().parent().isBoolean()))&&(newData.child('apikey').parent().parent().val()==null||true)&&true&&(!newData.child('apikey').parent().exists()||!(newData.child('apikey').parent().isString()||newData.child('apikey').parent().isNumber()||newData.child('apikey').parent().isBoolean()))&&(newData.child('apikey').parent().val()==null||true&&newData.child('apikey').parent().child('apikey').exists()&&newData.child('apikey').parent().child('email').exists()&&newData.child('apikey').parent().child('name').exists()&&newData.child('apikey').parent().child('password').exists()&&newData.child('apikey').parent().child('phone').exists()&&newData.child('apikey').parent().child('username').exists())&&true&&(!newData.child('apikey').exists()||newData.child('apikey').isString())&&true&&(!newData.child('email').parent().parent().parent().exists()||!(newData.child('email').parent().parent().parent().isString()||newData.child('email').parent().parent().parent().isNumber()||newData.child('email').parent().parent().parent().isBoolean()))&&(newData.child('email').parent().parent().parent().val()==null||true)&&true&&(!newData.child('email').parent().parent().exists()||!(newData.child('email').parent().parent().isString()||newData.child('email').parent().parent().isNumber()||newData.child('email').parent().parent().isBoolean()))&&(newData.child('email').parent().parent().val()==null||true)&&true&&(!newData.child('email').parent().exists()||!(newData.child('email').parent().isString()||newData.child('email').parent().isNumber()||newData.child('email').parent().isBoolean()))&&(newData.child('email').parent().val()==null||true&&newData.child('email').parent().child('apikey').exists()&&newData.child('email').parent().child('email').exists()&&newData.child('email').parent().child('name').exists()&&newData.child('email').parent().child('password').exists()&&newData.child('email').parent().child('phone').exists()&&newData.child('email').parent().child('username').exists())&&true&&(!newData.child('email').exists()||newData.child('email').isString())&&true&&(!newData.child('name').parent().parent().parent().exists()||!(newData.child('name').parent().parent().parent().isString()||newData.child('name').parent().parent().parent().isNumber()||newData.child('name').parent().parent().parent().isBoolean()))&&(newData.child('name').parent().parent().parent().val()==null||true)&&true&&(!newData.child('name').parent().parent().exists()||!(newData.child('name').parent().parent().isString()||newData.child('name').parent().parent().isNumber()||newData.child('name').parent().parent().isBoolean()))&&(newData.child('name').parent().parent().val()==null||true)&&true&&(!newData.child('name').parent().exists()||!(newData.child('name').parent().isString()||newData.child('name').parent().isNumber()||newData.child('name').parent().isBoolean()))&&(newData.child('name').parent().val()==null||true&&newData.child('name').parent().child('apikey').exists()&&newData.child('name').parent().child('email').exists()&&newData.child('name').parent().child('name').exists()&&newData.child('name').parent().child('password').exists()&&newData.child('name').parent().child('phone').exists()&&newData.child('name').parent().child('username').exists())&&true&&(!newData.child('name').exists()||newData.child('name').isString())&&true&&(!newData.child('password').parent().parent().parent().exists()||!(newData.child('password').parent().parent().parent().isString()||newData.child('password').parent().parent().parent().isNumber()||newData.child('password').parent().parent().parent().isBoolean()))&&(newData.child('password').parent().parent().parent().val()==null||true)&&true&&(!newData.child('password').parent().parent().exists()||!(newData.child('password').parent().parent().isString()||newData.child('password').parent().parent().isNumber()||newData.child('password').parent().parent().isBoolean()))&&(newData.child('password').parent().parent().val()==null||true)&&true&&(!newData.child('password').parent().exists()||!(newData.child('password').parent().isString()||newData.child('password').parent().isNumber()||newData.child('password').parent().isBoolean()))&&(newData.child('password').parent().val()==null||true&&newData.child('password').parent().child('apikey').exists()&&newData.child('password').parent().child('email').exists()&&newData.child('password').parent().child('name').exists()&&newData.child('password').parent().child('password').exists()&&newData.child('password').parent().child('phone').exists()&&newData.child('password').parent().child('username').exists())&&true&&(!newData.child('password').exists()||newData.child('password').isString())&&true&&(!newData.child('phone').parent().parent().parent().exists()||!(newData.child('phone').parent().parent().parent().isString()||newData.child('phone').parent().parent().parent().isNumber()||newData.child('phone').parent().parent().parent().isBoolean()))&&(newData.child('phone').parent().parent().parent().val()==null||true)&&true&&(!newData.child('phone').parent().parent().exists()||!(newData.child('phone').parent().parent().isString()||newData.child('phone').parent().parent().isNumber()||newData.child('phone').parent().parent().isBoolean()))&&(newData.child('phone').parent().parent().val()==null||true)&&true&&(!newData.child('phone').parent().exists()||!(newData.child('phone').parent().isString()||newData.child('phone').parent().isNumber()||newData.child('phone').parent().isBoolean()))&&(newData.child('phone').parent().val()==null||true&&newData.child('phone').parent().child('apikey').exists()&&newData.child('phone').parent().child('email').exists()&&newData.child('phone').parent().child('name').exists()&&newData.child('phone').parent().child('password').exists()&&newData.child('phone').parent().child('phone').exists()&&newData.child('phone').parent().child('username').exists())&&true&&(!newData.child('phone').exists()||newData.child('phone').isString())&&true&&(!newData.child('username').parent().parent().parent().exists()||!(newData.child('username').parent().parent().parent().isString()||newData.child('username').parent().parent().parent().isNumber()||newData.child('username').parent().parent().parent().isBoolean()))&&(newData.child('username').parent().parent().parent().val()==null||true)&&true&&(!newData.child('username').parent().parent().exists()||!(newData.child('username').parent().parent().isString()||newData.child('username').parent().parent().isNumber()||newData.child('username').parent().parent().isBoolean()))&&(newData.child('username').parent().parent().val()==null||true)&&true&&(!newData.child('username').parent().exists()||!(newData.child('username').parent().isString()||newData.child('username').parent().isNumber()||newData.child('username').parent().isBoolean()))&&(newData.child('username').parent().val()==null||true&&newData.child('username').parent().child('apikey').exists()&&newData.child('username').parent().child('email').exists()&&newData.child('username').parent().child('name').exists()&&newData.child('username').parent().child('password').exists()&&newData.child('username').parent().child('phone').exists()&&newData.child('username').parent().child('username').exists())&&true&&(!newData.child('username').exists()||newData.child('username').isString())&&false", | ||
".read":"false", | ||
"apikey": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
".write":"((false))", | ||
".read":"($userid===auth.username)", | ||
"inbox": { | ||
".write":"(false)", | ||
".read":"(($userid===auth.username))", | ||
"$message": { | ||
".write":"(((!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(!newData.exists()||!(((newData.isString()||newData.isNumber()||newData.isBoolean()))))&&(newData.val()==null||newData.child('from').exists()&&newData.child('to').exists()&&newData.child('message').exists())&&(auth.username==newData.child('from').val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.child('from').exists()||newData.child('from').isString())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('to').exists()||newData.child('to').isString())&&(!newData.child('message').exists()||newData.child('message').isString())&&(newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username)))", | ||
".read":"(($userid===auth.username))", | ||
"from": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(auth.username==newData.val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username)))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"to": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username)))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"message": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())&&(newData.exists()&&!data.exists()&&auth.username!==null||data.exists()&&!newData.exists()&&$userid===auth.username)))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
}, | ||
"email": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
}, | ||
"name": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
}, | ||
"password": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
}, | ||
"phone": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
}, | ||
"username": { | ||
".write":"true&&(!newData.parent().parent().parent().exists()||!(newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))&&(newData.parent().parent().parent().val()==null||true)&&true&&(!newData.parent().parent().exists()||!(newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))&&(newData.parent().parent().val()==null||true)&&true&&(!newData.parent().exists()||!(newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))&&(newData.parent().val()==null||true&&newData.parent().child('apikey').exists()&&newData.parent().child('email').exists()&&newData.parent().child('name').exists()&&newData.parent().child('password').exists()&&newData.parent().child('phone').exists()&&newData.parent().child('username').exists())&&true&&(!newData.exists()||newData.isString())&&false", | ||
".read":"false" | ||
}, | ||
"$other":{".validate":"false"} | ||
"outbox": { | ||
".write":"(false)", | ||
".read":"(($userid===auth.username))", | ||
"$message": { | ||
".write":"(((!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(!newData.exists()||!(((newData.isString()||newData.isNumber()||newData.isBoolean()))))&&(newData.val()==null||newData.child('from').exists()&&newData.child('to').exists()&&newData.child('message').exists())&&(auth.username==newData.child('from').val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.child('from').exists()||newData.child('from').isString())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.child('to').exists()||newData.child('to').isString())&&(!newData.child('message').exists()||newData.child('message').isString())))", | ||
".read":"(($userid===auth.username))", | ||
"from": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(auth.username==newData.val()&&newData.exists()&&!data.exists()||$userid===auth.username&&data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"to": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"message": { | ||
".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(newData.parent().val()==null||newData.parent().child('from').exists()&&newData.parent().child('to').exists()&&newData.parent().child('message').exists())&&(newData.exists()&&!data.exists()||data.exists()&&!newData.exists())&&(!newData.exists()||newData.isString())))", | ||
".read":"(($userid===auth.username))" | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
"$other":{".validate":"false"} | ||
} | ||
} |
@@ -272,3 +272,3 @@ require('source-map-support').install(); | ||
return optimizer.escapeEscapes(optimizer.simplify(code)); | ||
return optimizer.escapeEscapes(optimizer.optimize(code)); | ||
}; | ||
@@ -275,0 +275,0 @@ Expression.FALSE = new Expression("false", null); |
@@ -344,4 +344,5 @@ /// <reference path="../types/node.d.ts" /> | ||
return optimizer.escapeEscapes(optimizer.simplify(code)); | ||
//return optimizer.escapeEscapes(optimizer.simplify(code)); | ||
return optimizer.escapeEscapes(optimizer.optimize(code)); | ||
} | ||
} |
require('source-map-support').install(); | ||
var falafel = require("falafel"); | ||
function optimize(javascript_str) { | ||
var current_length = javascript_str.length + 1; | ||
while (javascript_str.length < current_length) { | ||
current_length = javascript_str.length; | ||
var current = javascript_str; | ||
javascript_str = exports.simplify(exports.clauseRepetitionElimination(exports.childParentAnnihilation(exports.pruneBooleanLiterals(javascript_str)))); | ||
} | ||
return current; | ||
} | ||
exports.optimize = optimize; | ||
function simplify(javascript_str) { | ||
@@ -31,2 +44,89 @@ var simplify_fn = function (node) { | ||
function pruneBooleanLiterals(javascript_str) { | ||
var simplify_fn = function (node) { | ||
if (node.type == "UnaryExpression") { | ||
if (node.operator == '!' && node.argument.type == 'Literal') { | ||
node.update(!node.argument.value); | ||
} | ||
} else if (node.type == "LogicalExpression") { | ||
node.left.is = function (val) { | ||
return node.left.type == 'Literal' && node.left.value == val; | ||
}; | ||
node.right.is = function (val) { | ||
return node.right.type == 'Literal' && node.right.value == val; | ||
}; | ||
if (node.operator == '&&' && node.left.is(true) && node.right.is(true)) { | ||
node.update("true"); | ||
} else if (node.operator == '&&' && node.left.is(false)) { | ||
node.update("false"); | ||
} else if (node.operator == '&&' && node.right.is(false)) { | ||
node.update("false"); | ||
} else if (node.operator == '&&' && node.left.is(true)) { | ||
node.update("(" + node.right.source() + ")"); | ||
} else if (node.operator == '&&' && node.right.is(true)) { | ||
node.update("(" + node.left.source() + ")"); | ||
} else if (node.operator == '||' && node.left.is(false) && node.right.is(false)) { | ||
node.update("false"); | ||
} else if (node.operator == '||' && node.left.is(true)) { | ||
node.update("true"); | ||
} else if (node.operator == '||' && node.right.is(true)) { | ||
node.update("true"); | ||
} else if (node.operator == '||' && node.left.is(false)) { | ||
node.update("(" + node.right.source() + ")"); | ||
} else if (node.operator == '||' && node.right.is(false)) { | ||
node.update("(" + node.left.source() + ")"); | ||
} | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
exports.pruneBooleanLiterals = pruneBooleanLiterals; | ||
function clauseRepetitionElimination(javascript_str) { | ||
var simplify_fn = function (node) { | ||
if (node.type == "LogicalExpression") { | ||
if (node.parent.type == "LogicalExpression" && node.parent.operator == node.operator) { | ||
} else { | ||
var operator = node.operator; | ||
var clauses = []; | ||
var logical = node; | ||
while (logical.type == "LogicalExpression" && logical.operator == operator) { | ||
clauses.push(logical.right.source()); | ||
logical = logical.left; | ||
} | ||
clauses.push(logical.source()); | ||
var clauses = clauses.reverse(); | ||
for (var primaryClause = 0; primaryClause < clauses.length; primaryClause++) { | ||
for (var repeatClause = primaryClause + 1; repeatClause < clauses.length; repeatClause++) { | ||
if (clauses[primaryClause] == clauses[repeatClause]) { | ||
clauses.splice(repeatClause, 1); | ||
repeatClause--; | ||
} | ||
} | ||
} | ||
node.update(exports.simplify("((" + clauses.join(")" + operator + "(") + "))")); | ||
} | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
exports.clauseRepetitionElimination = clauseRepetitionElimination; | ||
function childParentAnnihilation(javascript_str) { | ||
var simplify_fn = function (node) { | ||
if (node.type == 'MemberExpression' && node.object.type == 'CallExpression' && node.object.arguments.length == 0 && node.object.callee.type == 'MemberExpression' && node.object.callee.property.type == 'Identifier' && node.object.callee.property.name == 'parent' && node.object.callee.object.type == 'CallExpression' && node.object.callee.object.callee.type == 'MemberExpression' && node.object.callee.object.callee.property.type == 'Identifier' && node.object.callee.object.callee.property.name == 'child') { | ||
node.object.update(node.object.callee.object.callee.object.source()); | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
exports.childParentAnnihilation = childParentAnnihilation; | ||
var singleQuoteRegex = new RegExp("'", "g"); | ||
@@ -33,0 +133,0 @@ |
@@ -6,2 +6,24 @@ /// <reference path="../types/node.d.ts" /> | ||
/** | ||
* You can visualize ASTs using http://esprima.org/demo/parse.html which is handy | ||
*/ | ||
/** | ||
* We keep applying optimizations until the length of the code stops decreasing | ||
*/ | ||
export function optimize(javascript_str: string): string { | ||
//return simplify(javascript_str); | ||
var current_length = javascript_str.length + 1; | ||
while (javascript_str.length < current_length) { | ||
current_length = javascript_str.length; | ||
var current = javascript_str; | ||
//optimize stages | ||
javascript_str = simplify(clauseRepetitionElimination(childParentAnnihilation(pruneBooleanLiterals(javascript_str)))); | ||
} | ||
return current; | ||
} | ||
/** | ||
* rewrites the javascript to remove redundant parenthesis and white space | ||
@@ -37,2 +59,177 @@ */ | ||
/** | ||
* rewrites the javascript to remove pointless boolean literals like true && X | ||
*/ | ||
export function pruneBooleanLiterals(javascript_str: string): string{ | ||
var simplify_fn = function(node){ | ||
if (node.type == "UnaryExpression") { | ||
//!true => false | ||
if (node.operator == '!' && node.argument.type == 'Literal') { | ||
node.update(!node.argument.value) | ||
} | ||
} else if(node.type == "LogicalExpression") { | ||
//helper functions for querying literal arguments | ||
node.left.is = function(val) {return node.left.type == 'Literal' && node.left.value == val;}; | ||
node.right.is = function(val) {return node.right.type == 'Literal' && node.right.value == val;}; | ||
if (node.operator == '&&' && node.left.is(true) && node.right.is(true)) { | ||
node.update("true") | ||
} else if (node.operator == '&&' && node.left.is(false)) { | ||
node.update("false") | ||
} else if (node.operator == '&&' && node.right.is(false)) { | ||
node.update("false") | ||
} else if (node.operator == '&&' && node.left.is(true)) { | ||
node.update("("+node.right.source() + ")") | ||
} else if (node.operator == '&&' && node.right.is(true)) { | ||
node.update("("+node.left.source() + ")") | ||
} else if (node.operator == '||' && node.left.is(false) && node.right.is(false)) { | ||
node.update("false") | ||
} else if (node.operator == '||' && node.left.is(true)) { | ||
node.update("true") | ||
} else if (node.operator == '||' && node.right.is(true)) { | ||
node.update("true") | ||
} else if (node.operator == '||' && node.left.is(false)) { | ||
node.update("("+node.right.source() + ")") | ||
} else if (node.operator == '||' && node.right.is(false)) { | ||
node.update("("+node.left.source() + ")") | ||
} | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
/** | ||
* remove repeated clauses in && and || groups | ||
* note the order of lazy evaluation means the first occurrences ordering must be preserved! | ||
* a && b && c && c && b => a && b && c | ||
*/ | ||
export function clauseRepetitionElimination(javascript_str: string): string{ | ||
var simplify_fn = function(node){ | ||
if(node.type == "LogicalExpression") { | ||
if (node.parent.type == "LogicalExpression" && node.parent.operator == node.operator) { | ||
//so the parent is part of the same group so we don't want to do the expensive optimization yet | ||
} else { | ||
//we are the top level logical expression, lets hunt for repetitions | ||
//the left pointer should be another logical expression | ||
//the right should be a single expression | ||
var operator = node.operator; | ||
var clauses = []; | ||
var logical = node; | ||
while (logical.type == "LogicalExpression" && logical.operator == operator) { | ||
clauses.push(logical.right.source()); | ||
logical = logical.left; | ||
} | ||
clauses.push(logical.source()); //logical was the left of the previous seen logical expression | ||
var clauses = clauses.reverse(); //make the LHS first | ||
for (var primaryClause = 0; primaryClause < clauses.length; primaryClause++) { | ||
for (var repeatClause = primaryClause + 1; repeatClause < clauses.length; repeatClause++) { | ||
if (clauses[primaryClause] == clauses[repeatClause]) { | ||
//secondaryClause repeats the primary clause, so delete it and adjust the indexing | ||
clauses.splice(repeatClause,1); | ||
repeatClause--; //adjustment for an element being removed during a loop | ||
} | ||
} | ||
} | ||
//now clauses should have no repeatitions and should be in the correct order LEFT to RIGHT | ||
node.update(simplify("((" + clauses.join(")" + operator + "(") + "))")) | ||
} | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
/** | ||
* blah.child(XXX).parent().blah() => blah.blah() (if we don't include any other implementations of child) | ||
*/ | ||
export function childParentAnnihilation(javascript_str: string): string { | ||
/* | ||
data.child('x').parent().val() | ||
AST expansion looks like:- | ||
{ | ||
"type": "Program", | ||
"body": [ | ||
{ | ||
"type": "ExpressionStatement", | ||
"expression": { | ||
"type": "CallExpression", | ||
"callee": { | ||
"type": "MemberExpression", <--- start hunting here | ||
"computed": false, | ||
"object": { | ||
"type": "CallExpression", <---- () of parent, this will be removed | ||
"callee": { | ||
"type": "MemberExpression", | ||
"computed": false, | ||
"object": { | ||
"type": "CallExpression", | ||
"callee": { | ||
"type": "MemberExpression", | ||
"computed": false, | ||
"object": { <--- kept | ||
"type": "Identifier", | ||
"name": "data" | ||
}, | ||
"property": { | ||
"type": "Identifier", | ||
"name": "child" | ||
} | ||
}, | ||
"arguments": [ <---- irrelavant | ||
{ | ||
"type": "Literal", | ||
"value": "x", | ||
"raw": "'x'" | ||
} | ||
] | ||
}, | ||
"property": { | ||
"type": "Identifier", | ||
"name": "parent" | ||
} | ||
}, | ||
"arguments": [] | ||
}, | ||
"property": { | ||
"type": "Identifier", | ||
"name": "val" | ||
} | ||
}, | ||
"arguments": [] | ||
} | ||
} | ||
] | ||
} | ||
*/ | ||
var simplify_fn = function(node){ | ||
//detec tthe above situation and rewrite | ||
if (node.type == 'MemberExpression' && | ||
node.object.type == 'CallExpression' && | ||
node.object.arguments.length == 0 && | ||
node.object.callee.type == 'MemberExpression' && | ||
node.object.callee.property.type == 'Identifier' && | ||
node.object.callee.property.name == 'parent' && | ||
node.object.callee.object.type == 'CallExpression' && | ||
node.object.callee.object.callee.type == 'MemberExpression' && | ||
node.object.callee.object.callee.property.type == 'Identifier' && | ||
node.object.callee.object.callee.property.name == 'child') { | ||
//rewrite node | ||
node.object.update(node.object.callee.object.callee.object.source()) | ||
} | ||
}; | ||
return falafel(javascript_str.toString(), {}, simplify_fn).toString(); | ||
} | ||
var singleQuoteRegex = new RegExp("'", "g"); | ||
@@ -39,0 +236,0 @@ /** |
@@ -188,2 +188,12 @@ var test_utils = require('./test_utils'); | ||
exports.testSanitize = testSanitize; | ||
function testNestedWildchilds(test) { | ||
async.series([ | ||
firebase_io.assertSetValidationRules.bind(null, compiler.compile("test/cases/wildchild.yaml", true).code, test), | ||
test_utils.assert_admin_can_write.bind(null, "/nested/", {}, test), | ||
test_utils.assert_can_write.bind(null, null, "/nested/a/a/data", "a", test), | ||
test_utils.assert_cant_write.bind(null, null, "/nested/a/a/data", null, test) | ||
], test.done.bind(null)); | ||
} | ||
exports.testNestedWildchilds = testNestedWildchilds; | ||
//# sourceMappingURL=codegen_test.js.map |
@@ -251,1 +251,19 @@ /// <reference path="../types/nodeunit.d.ts" /> | ||
} | ||
export function testNestedWildchilds(test:nodeunit.Test):void{ | ||
async.series([ | ||
firebase_io.assertSetValidationRules.bind(null, compiler.compile("test/cases/wildchild.yaml", true).code, test), | ||
test_utils.assert_admin_can_write.bind(null, "/nested/",{}, test), | ||
//anyone can write to grandchildren | ||
test_utils.assert_can_write.bind(null, null,"/nested/a/a/data", "a", test), | ||
//no-one can delete because of constraint | ||
test_utils.assert_cant_write.bind(null, null,"/nested/a/a/data", null, test), | ||
//authenticated have greater permissions (can't do at the moment) | ||
//test_utils.assert_can_write.bind(null, "auth", "/nested/a", null, test), | ||
], test.done.bind(null)); | ||
} |
@@ -90,2 +90,44 @@ var optimizer = require('../src/optimizer'); | ||
exports.testEscapeQuotes2 = testEscapeQuotes2; | ||
function testPrune(test) { | ||
test.equal(optimizer.pruneBooleanLiterals("!true"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("!false"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && true"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && true"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && f"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("f && true"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && f"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("f && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("true || f"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("f || true"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("false || f"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("f || false"), "(f)"); | ||
test.done(); | ||
} | ||
exports.testPrune = testPrune; | ||
function testChildParentAnnihilation(test) { | ||
test.equal(optimizer.childParentAnnihilation("data.child('x').parent().val()"), "data.val()"); | ||
test.done(); | ||
} | ||
exports.testChildParentAnnihilation = testChildParentAnnihilation; | ||
function testClauseRepetitionElimination(test) { | ||
test.equal(optimizer.clauseRepetitionElimination("a && a"), "((a))"); | ||
test.equal(optimizer.clauseRepetitionElimination("a || a"), "((a))"); | ||
test.equal(optimizer.clauseRepetitionElimination("a && b && a"), "(a&&b)"); | ||
test.equal(optimizer.clauseRepetitionElimination("a && b && b && a && c && a"), "(a&&b&&c)"); | ||
test.equal(optimizer.clauseRepetitionElimination("d && b && b && a && c && a"), "(d&&b&&a&&c)"); | ||
test.equal(optimizer.clauseRepetitionElimination("d || b || b || a || c || a"), "(d||b||a||c)"); | ||
test.done(); | ||
} | ||
exports.testClauseRepetitionElimination = testClauseRepetitionElimination; | ||
//# sourceMappingURL=optimize_test.js.map |
@@ -5,3 +5,2 @@ /// <reference path="../types/nodeunit.d.ts" /> | ||
//var unoptimized:string = "true&&(true&&(true&&(!newData.child('chld1').child('grnd1').parent().parent().exists()||!(newData.child('chld1').child('grnd1').parent().parent().isString()||newData.child('chld1').child('grnd1').parent().parent().isNumber()||newData.child('chld1').child('grnd1').parent().parent().isBoolean()))&&(auth.username=='red'&&(!newData.child('chld1').child('grnd1').parent().exists()||!(newData.child('chld1').child('grnd1').parent().isString()||newData.child('chld1').child('grnd1').parent().isNumber()||newData.child('chld1').child('grnd1').parent().isBoolean())))&&((auth.username=='red'||auth.username=='black')&&(!newData.child('chld1').child('grnd1').exists()||newData.child('chld1').child('grnd1').isString())))&&(true&&(!newData.child('chld1').child('grnd2').parent().parent().exists()||!(newData.child('chld1').child('grnd2').parent().parent().isString()||newData.child('chld1').child('grnd2').parent().parent().isNumber()||newData.child('chld1').child('grnd2').parent().parent().isBoolean()))&&(auth.username=='red'&&(!newData.child('chld1').child('grnd2').parent().exists()||!(newData.child('chld1').child('grnd2').parent().isString()||newData.child('chld1').child('grnd2').parent().isNumber()||newData.child('chld1').child('grnd2').parent().isBoolean())))&&(true&&(!newData.child('chld1').child('grnd2').exists()||newData.child('chld1').child('grnd2').isString()))))&&(true&&(true&&(!newData.child('chld2').child('grnd3').parent().parent().exists()||!(newData.child('chld2').child('grnd3').parent().parent().isString()||newData.child('chld2').child('grnd3').parent().parent().isNumber()||newData.child('chld2').child('grnd3').parent().parent().isBoolean()))&&(true&&(!newData.child('chld2').child('grnd3').parent().exists()||!(newData.child('chld2').child('grnd3').parent().isString()||newData.child('chld2').child('grnd3').parent().isNumber()||newData.child('chld2').child('grnd3').parent().isBoolean())))&&(auth.username=='black'&&(!newData.child('chld2').child('grnd3').exists()||newData.child('chld2').child('grnd3').isString())))&&(true&&(!newData.child('chld2').child('grnd4').parent().parent().exists()||!(newData.child('chld2').child('grnd4').parent().parent().isString()||newData.child('chld2').child('grnd4').parent().parent().isNumber()||newData.child('chld2').child('grnd4').parent().parent().isBoolean()))&&(true&&(!newData.child('chld2').child('grnd4').parent().exists()||!(newData.child('chld2').child('grnd4').parent().isString()||newData.child('chld2').child('grnd4').parent().isNumber()||newData.child('chld2').child('grnd4').parent().isBoolean())))&&((auth.username=='red'||auth.username=='black')&&(!newData.child('chld2').child('grnd4').exists()||newData.child('chld2').child('grnd4').isString()))))&&(false||auth.username=='black')"; | ||
@@ -93,1 +92,41 @@ export function testSimplify1(test:nodeunit.Test):void{ | ||
export function testPrune(test:nodeunit.Test): void{ | ||
test.equal(optimizer.pruneBooleanLiterals("!true"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("!false"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && true"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && true"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("true && f"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("f && true"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("false && f"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("f && false"), "false"); | ||
test.equal(optimizer.pruneBooleanLiterals("true || f"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("f || true"), "true"); | ||
test.equal(optimizer.pruneBooleanLiterals("false || f"), "(f)"); | ||
test.equal(optimizer.pruneBooleanLiterals("f || false"), "(f)"); | ||
test.done(); | ||
} | ||
export function testChildParentAnnihilation(test:nodeunit.Test): void{ | ||
test.equal(optimizer.childParentAnnihilation("data.child('x').parent().val()"), "data.val()"); | ||
test.done(); | ||
} | ||
export function testClauseRepetitionElimination(test:nodeunit.Test): void{ | ||
test.equal(optimizer.clauseRepetitionElimination("a && a"), "((a))"); //bit weird with parenthesis | ||
test.equal(optimizer.clauseRepetitionElimination("a || a"), "((a))"); | ||
test.equal(optimizer.clauseRepetitionElimination("a && b && a"), "(a&&b)"); | ||
test.equal(optimizer.clauseRepetitionElimination("a && b && b && a && c && a"), "(a&&b&&c)"); | ||
test.equal(optimizer.clauseRepetitionElimination("d && b && b && a && c && a"), "(d&&b&&a&&c)"); | ||
test.equal(optimizer.clauseRepetitionElimination("d || b || b || a || c || a"), "(d||b||a||c)"); | ||
test.done(); | ||
} | ||
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
118
5791
497021