Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

blaze_compiler

Package Overview
Dependencies
Maintainers
1
Versions
34
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

blaze_compiler - npm Package Compare versions

Comparing version 0.0.14 to 0.0.15

.idea/libraries/virtualbrainfuck_node_modules.xml

57

examples/rules.json

@@ -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",

{
"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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc