js-beautify 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitmodules +4 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +27 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +13 -0
- data/Rakefile +29 -0
- data/VERSION +1 -0
- data/bin/js-beautify +5 -0
- data/init.sh +3 -0
- data/js-beautify-copy/.gitmodules +3 -0
- data/js-beautify-copy/Makefile +71 -0
- data/js-beautify-copy/README.md +39 -0
- data/js-beautify-copy/attic/beautify-cl/beautify-cl.js +142 -0
- data/js-beautify-copy/attic/bin/beautify_js +80 -0
- data/js-beautify-copy/attic/opera-userscript/beautifier.js +1087 -0
- data/js-beautify-copy/attic/opera-userscript/make_opera_userscript.sh +42 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.cpp +121 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.pro +5 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.qrc +6 -0
- data/js-beautify-copy/attic/qtscript/readme.txt +28 -0
- data/js-beautify-copy/attic/readme.txt +2 -0
- data/js-beautify-copy/attic/unmaintained/bbedit/jsBeautify_BBED.scpt +522 -0
- data/js-beautify-copy/attic/unmaintained/c-sharp/JSBeautify.cs +801 -0
- data/js-beautify-copy/attic/v8/README.txt +40 -0
- data/js-beautify-copy/attic/v8/beautify.h +2390 -0
- data/js-beautify-copy/attic/v8/jsbeautify.cpp +215 -0
- data/js-beautify-copy/beautify-css.js +198 -0
- data/js-beautify-copy/beautify-html.js +514 -0
- data/js-beautify-copy/beautify.js +1293 -0
- data/js-beautify-copy/favicon.png +0 -0
- data/js-beautify-copy/index.html +401 -0
- data/js-beautify-copy/jquery/jquery.cookie.js +96 -0
- data/js-beautify-copy/jquery/jquery.js +167 -0
- data/js-beautify-copy/license.txt +24 -0
- data/js-beautify-copy/php/jsbeautifier.php +1599 -0
- data/js-beautify-copy/php/test.php +476 -0
- data/js-beautify-copy/python/MANIFEST.in +2 -0
- data/js-beautify-copy/python/js-beautify +7 -0
- data/js-beautify-copy/python/js-beautify-profile +16 -0
- data/js-beautify-copy/python/js-beautify-test +10 -0
- data/js-beautify-copy/python/jsbeautifier/__init__.py +1166 -0
- data/js-beautify-copy/python/jsbeautifier/tests/__init__.py +1 -0
- data/js-beautify-copy/python/jsbeautifier/tests/testindentation.py +43 -0
- data/js-beautify-copy/python/jsbeautifier/tests/testjsbeautifier.py +464 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/README.specs.mkd +25 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/__init__.py +67 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/evalbased.py +39 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/javascriptobfuscator.py +58 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/myobfuscate.py +86 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/packer.py +104 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/__init__.py +2 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-myobfuscate-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-myobfuscate-output.js +65 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-packer-62-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-packer-non62-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testjavascriptobfuscator.py +46 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testmyobfuscate.py +40 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testpacker.py +34 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testurlencode.py +36 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/urlencode.py +34 -0
- data/js-beautify-copy/python/setup.py +17 -0
- data/js-beautify-copy/tests/beautify-tests.js +489 -0
- data/js-beautify-copy/tests/run-tests +17 -0
- data/js-beautify-copy/tests/sanitytest.js +128 -0
- data/js-beautify-copy/unpackers/javascriptobfuscator_unpacker.js +103 -0
- data/js-beautify-copy/unpackers/myobfuscate_unpacker.js +81 -0
- data/js-beautify-copy/unpackers/p_a_c_k_e_r_unpacker.js +61 -0
- data/js-beautify-copy/unpackers/urlencode_unpacker.js +51 -0
- data/lib/js-beautify.rb +0 -0
- data/test/helper.rb +18 -0
- data/test/test_js-beautify.rb +7 -0
- data/update.sh +23 -0
- metadata +173 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 H=(j["Y"]["n"]("1h")!=-1)?s:v;9 I=(j["Y"]["w"]()["n"]("1i")!=-1)?s:v;9 J=(j["K"]["n"]("1j")!=-1)?s:v;p Z(){9 a;9 b;9 c;y{b=o z("l.l.7");a=b.P("$Q")}A(c){};i(!a){y{b=o z("l.l.6");a="R 6,0,21,0";b["1k"]="1l";a=b.P("$Q")}A(c){}};i(!a){y{b=o z("l.l.3");a=b.P("$Q")}A(c){}};i(!a){y{b=o z("l.l.3");a="R 3,0,18,0"}A(c){}};i(!a){y{b=o z("l.l");a="R 2,0,0,11"}A(c){a=-1}};m a};p 10(){9 a=-1;i(j["t"]!=12&&j["t"]["13"]>0){i(j["t"]["L M 2.0"]||j["t"]["L M"]){9 b=j["t"]["L M 2.0"]?" 2.0":"";9 c=j["t"]["L M"+b]["1m"];9 d=c["B"](" ");9 e=d[2]["B"](".");9 f=e[0];9 g=e[1];9 h=d[3];i(h==""){h=d[4]};i(h[0]=="d"){h=h["S"](1)}k{i(h[0]=="r"){h=h["S"](1);i(h["n"]("d")>0){h=h["S"](0,h["n"]("d"))}}};9 a=f+"."+g+"."+h}}k{i(j["K"]["w"]()["n"]("T/2.6")!=-1){a=4}k{i(j["K"]["w"]()["n"]("T/2.5")!=-1){a=3}k{i(j["K"]["w"]()["n"]("T")!=-1){a=2}k{i(H&&I&&!J){a=Z()}}}}};m a};p 1n(a,b,c){C=10();i(C==-1){m v}k{i(C!=0){i(H&&I&&!J){14=C["B"](" ");15=14[1];D=15["B"](",")}k{D=C["B"](".")};9 d=D[0];9 e=D[1];9 f=D[2];i(d>E(a)){m s}k{i(d==E(a)){i(e>E(b)){m s}k{i(e==E(b)){i(f>=E(c)){m s}}}}};m v}}};p 16(a,b){i(a["n"]("?")!=-1){m a["1o"](/\\?/,b+"?")}k{m a+b}};p U(a,b,c){9 d="";i(H&&I&&!J){d+="<17 ";N(9 e V a){d+=e+"=""+a[e]+"" "};d+=">";N(9 e V b){d+="<1p 19=""+e+"" 1q=""+b[e]+"" /> "};d+="</17>"}k{d+="<1a ";N(9 e V c){d+=e+"=""+c[e]+"" "};d+="> </1a>"};1r["1s"](d)};p 1t(){9 a=W(1b,".1u","1c","1d:1v-1w-1x-1y-1e","1z/x-1A-1B");U(a["u"],a["F"],a["q"])};p 1C(){9 a=W(1b,".1D","X","1d:1E-1F-1G-1H-1e",12);U(a["u"],a["F"],a["q"])};p W(a,b,c,d,e){9 f=o O();f["q"]=o O();f["F"]=o O();f["u"]=o O();N(9 g=0;g<a["13"];g=g+2){9 h=a[g]["w"]();1I(h){8"1f":G;8"1J":f["q"][a[g]]=a[g+1];G;8"X":;8"1c":a[g+1]=16(a[g+1],b);f["q"]["X"]=a[g+1];f["F"][c]=a[g+1];G;8"1K":;8"1L":;8"1M":;8"1N":;8"1O":;8"1P":;8"1Q":;8"1R":;8"1S":;8"1T":;8"1U":;8"1V":;8"1W":;8"1X":;8"1Y":;8"1Z":;8"20":;8"22":;8"23":;8"24":;8"25":;8"26":;8"27":;8"28":;8"29":;8"2a":;8"2b":;8"2c":;8"2d":;8"2e":;8"2f":;8"2g":;8"2h":;8"2i":;8"2j":;8"2k":;8"2l":;8"1g":;8"2m":;8"2n":f["u"][a[g]]=a[g+1];G;8"2o":;8"2p":;8"2q":;8"2r":;8"2s":;8"2t":;8"2u":;8"2v":;8"19":;8"2w":f["q"][a[g]]=f["u"][a[g]]=a[g+1];G;2x:f["q"][a[g]]=f["F"][a[g]]=a[g+1]}};f["u"]["1f"]=d;i(e){f["q"]["1g"]=e};m f};',62,158,'||||||||case|var|||||||||if|navigator|else|ShockwaveFlash|return|indexOf|new|function|embedAttrs||true|plugins|objAttrs|false|toLowerCase||try|ActiveXObject|catch|split|versionStr|versionArray|parseFloat|params|break|isIE|isWin|isOpera|userAgent|Shockwave|Flash|for|Object|GetVariable|version|WIN|substring|webtv|AC_Generateobj|in|AC_GetArgs|src|appVersion|ControlVersion|GetSwfVer||null|length|tempArray|tempString|AC_AddExtension|object||name|embed|arguments|movie|clsid|444553540000|classid|type|MSIE|win|Opera|AllowScriptAccess|always|description|DetectFlashVer|replace|param|value|document|write|AC_FL_RunContent|swf|d27cdb6e|ae6d|11cf|96b8|application|shockwave|flash|AC_SW_RunContent|dcr|166B1BCA|3F9C|11CF|8075|switch|pluginspage|onafterupdate|onbeforeupdate|onblur|oncellchange|onclick|ondblclick|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondrop|onfinish|onfocus|onhelp|onmousedown|onmouseup||onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup|onload|onlosecapture|onpropertychange|onreadystatechange|onrowsdelete|onrowenter|onrowexit|onrowsinserted|onstart|onscroll|onbeforeeditfocus|onactivate|onbeforedeactivate|ondeactivate|codebase|id|width|height|align|vspace|hspace|class|title|accesskey|tabindex|default'.split('|'),0,{}))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var isIE=(navigator["appVersion"]["indexOf"]("MSIE")!=-1)?true:false;var isWin=(navigator["appVersion"]["toLowerCase"]()["indexOf"]("win")!=-1)?true:false;var isOpera=(navigator["userAgent"]["indexOf"]("Opera")!=-1)?true:false;function ControlVersion(){var a;var b;var c;try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=b.GetVariable("$version")}catch(c){};if(!a){try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");a="WIN 6,0,21,0";b["AllowScriptAccess"]="always";a=b.GetVariable("$version")}catch(c){}};if(!a){try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");a=b.GetVariable("$version")}catch(c){}};if(!a){try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");a="WIN 3,0,18,0"}catch(c){}};if(!a){try{b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");a="WIN 2,0,0,11"}catch(c){a=-1}};return a};function GetSwfVer(){var a=-1;if(navigator["plugins"]!=null&&navigator["plugins"]["length"]>0){if(navigator["plugins"]["Shockwave Flash 2.0"]||navigator["plugins"]["Shockwave Flash"]){var b=navigator["plugins"]["Shockwave Flash 2.0"]?" 2.0":"";var c=navigator["plugins"]["Shockwave Flash"+b]["description"];var d=c["split"](" ");var e=d[2]["split"](".");var f=e[0];var g=e[1];var h=d[3];if(h==""){h=d[4]};if(h[0]=="d"){h=h["substring"](1)}else{if(h[0]=="r"){h=h["substring"](1);if(h["indexOf"]("d")>0){h=h["substring"](0,h["indexOf"]("d"))}}};var a=f+"."+g+"."+h}}else{if(navigator["userAgent"]["toLowerCase"]()["indexOf"]("webtv/2.6")!=-1){a=4}else{if(navigator["userAgent"]["toLowerCase"]()["indexOf"]("webtv/2.5")!=-1){a=3}else{if(navigator["userAgent"]["toLowerCase"]()["indexOf"]("webtv")!=-1){a=2}else{if(isIE&&isWin&&!isOpera){a=ControlVersion()}}}}};return a};function DetectFlashVer(a,b,c){versionStr=GetSwfVer();if(versionStr==-1){return false}else{if(versionStr!=0){if(isIE&&isWin&&!isOpera){tempArray=versionStr["split"](" ");tempString=tempArray[1];versionArray=tempString["split"](",")}else{versionArray=versionStr["split"](".")};var d=versionArray[0];var e=versionArray[1];var f=versionArray[2];if(d>parseFloat(a)){return true}else{if(d==parseFloat(a)){if(e>parseFloat(b)){return true}else{if(e==parseFloat(b)){if(f>=parseFloat(c)){return true}}}}};return false}}};function AC_AddExtension(a,b){if(a["indexOf"]("?")!=-1){return a["replace"](/\?/,b+"?")}else{return a+b}};function AC_Generateobj(a,b,c){var d="";if(isIE&&isWin&&!isOpera){d+="<object ";for(var e in a){d+=e+"=""+a[e]+"" "};d+=">";for(var e in b){d+="<param name=""+e+"" value=""+b[e]+"" /> "};d+="</object>"}else{d+="<embed ";for(var e in c){d+=e+"=""+c[e]+"" "};d+="> </embed>"};document["write"](d)};function AC_FL_RunContent(){var a=AC_GetArgs(arguments,".swf","movie","clsid:d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash");AC_Generateobj(a["objAttrs"],a["params"],a["embedAttrs"])};function AC_SW_RunContent(){var a=AC_GetArgs(arguments,".dcr","src","clsid:166B1BCA-3F9C-11CF-8075-444553540000",null);AC_Generateobj(a["objAttrs"],a["params"],a["embedAttrs"])};function AC_GetArgs(a,b,c,d,e){var f=new Object();f["embedAttrs"]=new Object();f["params"]=new Object();f["objAttrs"]=new Object();for(var g=0;g<a["length"];g=g+2){var h=a[g]["toLowerCase"]();switch(h){case"classid":break;case"pluginspage":f["embedAttrs"][a[g]]=a[g+1];break;case"src":;case"movie":a[g+1]=AC_AddExtension(a[g+1],b);f["embedAttrs"]["src"]=a[g+1];f["params"][c]=a[g+1];break;case"onafterupdate":;case"onbeforeupdate":;case"onblur":;case"oncellchange":;case"onclick":;case"ondblclick":;case"ondrag":;case"ondragend":;case"ondragenter":;case"ondragleave":;case"ondragover":;case"ondrop":;case"onfinish":;case"onfocus":;case"onhelp":;case"onmousedown":;case"onmouseup":;case"onmouseover":;case"onmousemove":;case"onmouseout":;case"onkeypress":;case"onkeydown":;case"onkeyup":;case"onload":;case"onlosecapture":;case"onpropertychange":;case"onreadystatechange":;case"onrowsdelete":;case"onrowenter":;case"onrowexit":;case"onrowsinserted":;case"onstart":;case"onscroll":;case"onbeforeeditfocus":;case"onactivate":;case"onbeforedeactivate":;case"ondeactivate":;case"type":;case"codebase":;case"id":f["objAttrs"][a[g]]=a[g+1];break;case"width":;case"height":;case"align":;case"vspace":;case"hspace":;case"class":;case"title":;case"accesskey":;case"name":;case"tabindex":f["embedAttrs"][a[g]]=f["objAttrs"][a[g]]=a[g+1];break;default:f["embedAttrs"][a[g]]=f["params"][a[g]]=a[g+1]}};f["objAttrs"]["classid"]=d;if(e){f["embedAttrs"]["type"]=e};return f};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#
|
|
2
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
"""Tests for JavaScriptObfuscator unpacker."""
|
|
6
|
+
|
|
7
|
+
import unittest
|
|
8
|
+
from jsbeautifier.unpackers.javascriptobfuscator import (
|
|
9
|
+
unpack, detect, smartsplit)
|
|
10
|
+
|
|
11
|
+
# pylint: disable=R0904
|
|
12
|
+
class TestJavascriptObfuscator(unittest.TestCase):
|
|
13
|
+
"""JavascriptObfuscator.com test case."""
|
|
14
|
+
def test_smartsplit(self):
|
|
15
|
+
"""Test smartsplit() function."""
|
|
16
|
+
split = smartsplit
|
|
17
|
+
equals = lambda data, result: self.assertEqual(split(data), result)
|
|
18
|
+
|
|
19
|
+
equals('', [])
|
|
20
|
+
equals('"a", "b"', ['"a"', '"b"'])
|
|
21
|
+
equals('"aaa","bbbb"', ['"aaa"', '"bbbb"'])
|
|
22
|
+
equals('"a", "b\\\""', ['"a"', '"b\\\""'])
|
|
23
|
+
|
|
24
|
+
def test_detect(self):
|
|
25
|
+
"""Test detect() function."""
|
|
26
|
+
positive = lambda source: self.assertTrue(detect(source))
|
|
27
|
+
negative = lambda source: self.assertFalse(detect(source))
|
|
28
|
+
|
|
29
|
+
negative('')
|
|
30
|
+
negative('abcd')
|
|
31
|
+
negative('var _0xaaaa')
|
|
32
|
+
positive('var _0xaaaa = ["a", "b"]')
|
|
33
|
+
positive('var _0xaaaa=["a", "b"]')
|
|
34
|
+
positive('var _0x1234=["a","b"]')
|
|
35
|
+
|
|
36
|
+
def test_unpack(self):
|
|
37
|
+
"""Test unpack() function."""
|
|
38
|
+
decodeto = lambda ob, original: self.assertEqual(unpack(ob), original)
|
|
39
|
+
|
|
40
|
+
decodeto('var _0x8df3=[];var a=10;', 'var a=10;')
|
|
41
|
+
decodeto('var _0xb2a7=["\x74\x27\x65\x73\x74"];var i;for(i=0;i<10;++i)'
|
|
42
|
+
'{alert(_0xb2a7[0]);} ;', 'var i;for(i=0;i<10;++i){alert'
|
|
43
|
+
'("t\'est");} ;')
|
|
44
|
+
|
|
45
|
+
if __name__ == '__main__':
|
|
46
|
+
unittest.main()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#
|
|
2
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
"""Tests for MyObfuscate unpacker."""
|
|
6
|
+
|
|
7
|
+
import unittest
|
|
8
|
+
import os
|
|
9
|
+
from jsbeautifier.unpackers.myobfuscate import detect, unpack
|
|
10
|
+
from jsbeautifier.unpackers.tests import __path__ as path
|
|
11
|
+
|
|
12
|
+
INPUT = os.path.join(path[0], 'test-myobfuscate-input.js')
|
|
13
|
+
OUTPUT = os.path.join(path[0], 'test-myobfuscate-output.js')
|
|
14
|
+
|
|
15
|
+
# pylint: disable=R0904
|
|
16
|
+
class TestMyObfuscate(unittest.TestCase):
|
|
17
|
+
# pylint: disable=C0103
|
|
18
|
+
"""MyObfuscate obfuscator testcase."""
|
|
19
|
+
@classmethod
|
|
20
|
+
def setUpClass(cls):
|
|
21
|
+
"""Load source files (encoded and decoded version) for tests."""
|
|
22
|
+
with open(INPUT, 'r') as data:
|
|
23
|
+
cls.input = data.read()
|
|
24
|
+
with open(OUTPUT, 'r') as data:
|
|
25
|
+
cls.output = data.read()
|
|
26
|
+
|
|
27
|
+
def test_detect(self):
|
|
28
|
+
"""Test detect() function."""
|
|
29
|
+
detected = lambda source: self.assertTrue(detect(source))
|
|
30
|
+
|
|
31
|
+
detected(self.input)
|
|
32
|
+
|
|
33
|
+
def test_unpack(self):
|
|
34
|
+
"""Test unpack() function."""
|
|
35
|
+
check = lambda inp, out: self.assertEqual(unpack(inp), out)
|
|
36
|
+
|
|
37
|
+
check(self.input, self.output)
|
|
38
|
+
|
|
39
|
+
if __name__ == '__main__':
|
|
40
|
+
unittest.main()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#
|
|
2
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
"""Tests for P.A.C.K.E.R. unpacker."""
|
|
6
|
+
|
|
7
|
+
import unittest
|
|
8
|
+
from jsbeautifier.unpackers.packer import detect, unpack
|
|
9
|
+
|
|
10
|
+
# pylint: disable=R0904
|
|
11
|
+
class TestPacker(unittest.TestCase):
|
|
12
|
+
"""P.A.C.K.E.R. testcase."""
|
|
13
|
+
def test_detect(self):
|
|
14
|
+
"""Test detect() function."""
|
|
15
|
+
positive = lambda source: self.assertTrue(detect(source))
|
|
16
|
+
negative = lambda source: self.assertFalse(detect(source))
|
|
17
|
+
|
|
18
|
+
negative('')
|
|
19
|
+
negative('var a = b')
|
|
20
|
+
positive('eval(function(p,a,c,k,e,r')
|
|
21
|
+
positive('eval ( function(p, a, c, k, e, r')
|
|
22
|
+
|
|
23
|
+
def test_unpack(self):
|
|
24
|
+
"""Test unpack() function."""
|
|
25
|
+
check = lambda inp, out: self.assertEqual(unpack(inp), out)
|
|
26
|
+
|
|
27
|
+
check("eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)"
|
|
28
|
+
"){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e="
|
|
29
|
+
"function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace("
|
|
30
|
+
"new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',"
|
|
31
|
+
"62,3,'var||a'.split('|'),0,{}))", 'var a=1')
|
|
32
|
+
|
|
33
|
+
if __name__ == '__main__':
|
|
34
|
+
unittest.main()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#
|
|
2
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
"""Tests for urlencoded unpacker."""
|
|
6
|
+
|
|
7
|
+
import unittest
|
|
8
|
+
|
|
9
|
+
from jsbeautifier.unpackers.urlencode import detect, unpack
|
|
10
|
+
|
|
11
|
+
# pylint: disable=R0904
|
|
12
|
+
class TestUrlencode(unittest.TestCase):
|
|
13
|
+
"""urlencode test case."""
|
|
14
|
+
def test_detect(self):
|
|
15
|
+
"""Test detect() function."""
|
|
16
|
+
encoded = lambda source: self.assertTrue(detect(source))
|
|
17
|
+
unencoded = lambda source: self.assertFalse(detect(source))
|
|
18
|
+
|
|
19
|
+
unencoded('')
|
|
20
|
+
unencoded('var a = b')
|
|
21
|
+
encoded('var%20a+=+b')
|
|
22
|
+
encoded('var%20a=b')
|
|
23
|
+
encoded('var%20%21%22')
|
|
24
|
+
|
|
25
|
+
def test_unpack(self):
|
|
26
|
+
"""Test unpack function."""
|
|
27
|
+
equals = lambda source, result: self.assertEqual(unpack(source), result)
|
|
28
|
+
|
|
29
|
+
equals('', '')
|
|
30
|
+
equals('abcd', 'abcd')
|
|
31
|
+
equals('var a = b', 'var a = b')
|
|
32
|
+
equals('var%20a=b', 'var a=b')
|
|
33
|
+
equals('var%20a+=+b', 'var a = b')
|
|
34
|
+
|
|
35
|
+
if __name__ == '__main__':
|
|
36
|
+
unittest.main()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Trivial bookmarklet/escaped script detector for the javascript beautifier
|
|
3
|
+
# written by Einar Lielmanis <einar@jsbeautifier.org>
|
|
4
|
+
# rewritten in Python by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
5
|
+
#
|
|
6
|
+
# Will always return valid javascript: if `detect()` is false, `code` is
|
|
7
|
+
# returned, unmodified.
|
|
8
|
+
#
|
|
9
|
+
# usage:
|
|
10
|
+
#
|
|
11
|
+
# some_string = urlencode.unpack(some_string)
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
"""Bookmarklet/escaped script unpacker."""
|
|
15
|
+
|
|
16
|
+
# Python 2 retrocompatibility
|
|
17
|
+
# pylint: disable=F0401
|
|
18
|
+
# pylint: disable=E0611
|
|
19
|
+
try:
|
|
20
|
+
from urllib import unquote_plus
|
|
21
|
+
except ImportError:
|
|
22
|
+
from urllib.parse import unquote_plus
|
|
23
|
+
|
|
24
|
+
PRIORITY = 0
|
|
25
|
+
|
|
26
|
+
def detect(code):
|
|
27
|
+
"""Detects if a scriptlet is urlencoded."""
|
|
28
|
+
# the fact that script doesn't contain any space, but has %20 instead
|
|
29
|
+
# should be sufficient check for now.
|
|
30
|
+
return ' ' not in code and ('%20' in code or code.count('%') > 3)
|
|
31
|
+
|
|
32
|
+
def unpack(code):
|
|
33
|
+
"""URL decode `code` source string."""
|
|
34
|
+
return unquote_plus(code) if detect(code) else code
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
from distutils.core import setup
|
|
4
|
+
|
|
5
|
+
setup(name='jsbeautifier',
|
|
6
|
+
version='1.0',
|
|
7
|
+
description='JavaScript unobfuscator and beautifier.',
|
|
8
|
+
long_description=('Beautify, unpack or deobfuscate JavaScript. '
|
|
9
|
+
'Handles popular online obfuscators.'),
|
|
10
|
+
author='Einar Lielmanis, Stefano Sanfilippo et al.',
|
|
11
|
+
author_email='einar@jsbeautifier.org',
|
|
12
|
+
url='http://jsbeautifier.org',
|
|
13
|
+
scripts=['js-beautify'],
|
|
14
|
+
packages=['jsbeautifier', 'jsbeautifier.tests',
|
|
15
|
+
'jsbeautifier.unpackers', 'jsbeautifier.unpackers.tests'],
|
|
16
|
+
license='MIT',
|
|
17
|
+
)
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
/*global js_beautify */
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
opts = {
|
|
5
|
+
indent_size: 4,
|
|
6
|
+
indent_char: ' ',
|
|
7
|
+
preserve_newlines: true,
|
|
8
|
+
jslint_happy: false,
|
|
9
|
+
keep_array_indentation: false,
|
|
10
|
+
brace_style: 'collapse',
|
|
11
|
+
space_before_conditional: true
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function test_beautifier(input)
|
|
15
|
+
{
|
|
16
|
+
return js_beautify(input, opts);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var sanitytest;
|
|
20
|
+
|
|
21
|
+
// test the input on beautifier with the current flag settings
|
|
22
|
+
// does not check the indentation / surroundings as bt() does
|
|
23
|
+
function test_fragment(input, expected)
|
|
24
|
+
{
|
|
25
|
+
expected = expected || input;
|
|
26
|
+
sanitytest.expect(input, expected);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
// test the input on beautifier with the current flag settings
|
|
32
|
+
// test both the input as well as { input } wrapping
|
|
33
|
+
function bt(input, expectation)
|
|
34
|
+
{
|
|
35
|
+
var wrapped_input, wrapped_expectation;
|
|
36
|
+
|
|
37
|
+
expectation = expectation || input;
|
|
38
|
+
test_fragment(input, expectation);
|
|
39
|
+
|
|
40
|
+
// test also the returned indentation
|
|
41
|
+
// e.g if input = "asdf();"
|
|
42
|
+
// then test that this remains properly formatted as well:
|
|
43
|
+
// {
|
|
44
|
+
// asdf();
|
|
45
|
+
// indent;
|
|
46
|
+
// }
|
|
47
|
+
|
|
48
|
+
if (opts.indent_size === 4 && input) {
|
|
49
|
+
wrapped_input = '{\n' + input + '\nfoo=bar;}';
|
|
50
|
+
wrapped_expectation = '{\n' + expectation.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}';
|
|
51
|
+
test_fragment(wrapped_input, wrapped_expectation);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// test the input on beautifier with the current flag settings,
|
|
57
|
+
// but dont't
|
|
58
|
+
function bt_braces(input, expectation)
|
|
59
|
+
{
|
|
60
|
+
var braces_ex = opts.brace_style;
|
|
61
|
+
opts.brace_style = 'expand';
|
|
62
|
+
bt(input, expectation);
|
|
63
|
+
opts.brace_style = braces_ex;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function run_beautifier_tests(test_obj)
|
|
67
|
+
{
|
|
68
|
+
sanitytest = test_obj || new SanityTest();
|
|
69
|
+
sanitytest.test_function(test_beautifier, 'js_beautify');
|
|
70
|
+
|
|
71
|
+
opts.indent_size = 4;
|
|
72
|
+
opts.indent_char = ' ';
|
|
73
|
+
opts.preserve_newlines = true;
|
|
74
|
+
opts.jslint_happy = false;
|
|
75
|
+
opts.keep_array_indentation = false;
|
|
76
|
+
opts.brace_style = "collapse";
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
bt('');
|
|
80
|
+
bt('return .5');
|
|
81
|
+
test_fragment(' return .5');
|
|
82
|
+
bt('a = 1', 'a = 1');
|
|
83
|
+
bt('a=1', 'a = 1');
|
|
84
|
+
bt("a();\n\nb();", "a();\n\nb();");
|
|
85
|
+
bt('var a = 1 var b = 2', "var a = 1\nvar b = 2");
|
|
86
|
+
bt('var a=1, b=c[d], e=6;', 'var a = 1,\n b = c[d],\n e = 6;');
|
|
87
|
+
bt('a = " 12345 "');
|
|
88
|
+
bt("a = ' 12345 '");
|
|
89
|
+
bt('if (a == 1) b = 2;', "if (a == 1) b = 2;");
|
|
90
|
+
bt('if(1){2}else{3}', "if (1) {\n 2\n} else {\n 3\n}");
|
|
91
|
+
bt('if (foo) bar();\nelse\ncar();', 'if (foo) bar();\nelse car();');
|
|
92
|
+
bt('if(1||2);', 'if (1 || 2);');
|
|
93
|
+
bt('(a==1)||(b==2)', '(a == 1) || (b == 2)');
|
|
94
|
+
bt('var a = 1 if (2) 3;', "var a = 1\nif (2) 3;");
|
|
95
|
+
bt('a = a + 1');
|
|
96
|
+
bt('a = a == 1');
|
|
97
|
+
bt('/12345[^678]*9+/.match(a)');
|
|
98
|
+
bt('a /= 5');
|
|
99
|
+
bt('a = 0.5 * 3');
|
|
100
|
+
bt('a *= 10.55');
|
|
101
|
+
bt('a < .5');
|
|
102
|
+
bt('a <= .5');
|
|
103
|
+
bt('a<.5', 'a < .5');
|
|
104
|
+
bt('a<=.5', 'a <= .5');
|
|
105
|
+
bt('a = 0xff;');
|
|
106
|
+
bt('a=0xff+4', 'a = 0xff + 4');
|
|
107
|
+
bt('a = [1, 2, 3, 4]');
|
|
108
|
+
bt('F*(g/=f)*g+b', 'F * (g /= f) * g + b');
|
|
109
|
+
bt('a.b({c:d})', "a.b({\n c: d\n})");
|
|
110
|
+
bt('a.b\n(\n{\nc:\nd\n}\n)', "a.b({\n c: d\n})");
|
|
111
|
+
bt('a=!b', 'a = !b');
|
|
112
|
+
bt('a?b:c', 'a ? b : c');
|
|
113
|
+
bt('a?1:2', 'a ? 1 : 2');
|
|
114
|
+
bt('a?(b):c', 'a ? (b) : c');
|
|
115
|
+
bt('x={a:1,b:w=="foo"?x:y,c:z}', 'x = {\n a: 1,\n b: w == "foo" ? x : y,\n c: z\n}');
|
|
116
|
+
bt('x=a?b?c?d:e:f:g;', 'x = a ? b ? c ? d : e : f : g;');
|
|
117
|
+
bt('x=a?b?c?d:{e1:1,e2:2}:f:g;', 'x = a ? b ? c ? d : {\n e1: 1,\n e2: 2\n} : f : g;');
|
|
118
|
+
bt('function void(void) {}');
|
|
119
|
+
bt('if(!a)foo();', 'if (!a) foo();');
|
|
120
|
+
bt('a=~a', 'a = ~a');
|
|
121
|
+
bt('a;/*comment*/b;', "a; /*comment*/\nb;");
|
|
122
|
+
bt('a;/* comment */b;', "a; /* comment */\nb;");
|
|
123
|
+
test_fragment('a;/*\ncomment\n*/b;', "a;\n/*\ncomment\n*/\nb;"); // simple comments don't get touched at all
|
|
124
|
+
bt('a;/**\n* javadoc\n*/b;', "a;\n/**\n * javadoc\n */\nb;");
|
|
125
|
+
test_fragment('a;/**\n\nno javadoc\n*/b;', "a;\n/**\n\nno javadoc\n*/\nb;");
|
|
126
|
+
bt('a;/*\n* javadoc\n*/b;', "a;\n/*\n * javadoc\n */\nb;"); // comment blocks detected and reindented even w/o javadoc starter
|
|
127
|
+
bt('if(a)break;', "if (a) break;");
|
|
128
|
+
bt('if(a){break}', "if (a) {\n break\n}");
|
|
129
|
+
bt('if((a))foo();', 'if ((a)) foo();');
|
|
130
|
+
bt('for(var i=0;;)', 'for (var i = 0;;)');
|
|
131
|
+
bt('a++;', 'a++;');
|
|
132
|
+
bt('for(;;i++)', 'for (;; i++)');
|
|
133
|
+
bt('for(;;++i)', 'for (;; ++i)');
|
|
134
|
+
bt('return(1)', 'return (1)');
|
|
135
|
+
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n} catch (b) {\n c();\n} finally {\n d();\n}");
|
|
136
|
+
bt('(xx)()'); // magic function call
|
|
137
|
+
bt('a[1]()'); // another magic function call
|
|
138
|
+
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n} else if (c) foo();");
|
|
139
|
+
bt('switch(x) {case 0: case 1: a(); break; default: break}', "switch (x) {\ncase 0:\ncase 1:\n a();\n break;\ndefault:\n break\n}");
|
|
140
|
+
bt('switch(x){case -1:break;case !y:break;}', 'switch (x) {\ncase -1:\n break;\ncase !y:\n break;\n}');
|
|
141
|
+
bt('a !== b');
|
|
142
|
+
bt('if (a) b(); else c();', "if (a) b();\nelse c();");
|
|
143
|
+
bt("// comment\n(function something() {})"); // typical greasemonkey start
|
|
144
|
+
bt("{\n\n x();\n\n}"); // was: duplicating newlines
|
|
145
|
+
bt('if (a in b) foo();');
|
|
146
|
+
// bt('var a, b');
|
|
147
|
+
bt('{a:1, b:2}', "{\n a: 1,\n b: 2\n}");
|
|
148
|
+
bt('a={1:[-1],2:[+1]}', 'a = {\n 1: [-1],\n 2: [+1]\n}');
|
|
149
|
+
bt('var l = {\'a\':\'1\', \'b\':\'2\'}', "var l = {\n 'a': '1',\n 'b': '2'\n}");
|
|
150
|
+
bt('if (template.user[n] in bk) foo();');
|
|
151
|
+
bt('{{}/z/}', "{\n {}\n /z/\n}");
|
|
152
|
+
bt('return 45', "return 45");
|
|
153
|
+
bt('If[1]', "If[1]");
|
|
154
|
+
bt('Then[1]', "Then[1]");
|
|
155
|
+
bt('a = 1e10', "a = 1e10");
|
|
156
|
+
bt('a = 1.3e10', "a = 1.3e10");
|
|
157
|
+
bt('a = 1.3e-10', "a = 1.3e-10");
|
|
158
|
+
bt('a = -1.3e-10', "a = -1.3e-10");
|
|
159
|
+
bt('a = 1e-10', "a = 1e-10");
|
|
160
|
+
bt('a = e - 10', "a = e - 10");
|
|
161
|
+
bt('a = 11-10', "a = 11 - 10");
|
|
162
|
+
bt("a = 1;// comment\n", "a = 1; // comment");
|
|
163
|
+
bt("a = 1; // comment\n", "a = 1; // comment");
|
|
164
|
+
bt("a = 1;\n // comment\n", "a = 1;\n// comment");
|
|
165
|
+
|
|
166
|
+
bt('o = [{a:b},{c:d}]', 'o = [{\n a: b\n}, {\n c: d\n}]');
|
|
167
|
+
|
|
168
|
+
bt("if (a) {\n do();\n}"); // was: extra space appended
|
|
169
|
+
bt("if\n(a)\nb();", "if (a) b();"); // test for proper newline removal
|
|
170
|
+
|
|
171
|
+
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n} else {\n // comment\n}"); // if/else statement with empty body
|
|
172
|
+
bt("if (a) {\n// comment\n// comment\n}", "if (a) {\n // comment\n // comment\n}"); // multiple comments indentation
|
|
173
|
+
bt("if (a) b() else c();", "if (a) b()\nelse c();");
|
|
174
|
+
bt("if (a) b() else if c() d();", "if (a) b()\nelse if c() d();");
|
|
175
|
+
|
|
176
|
+
bt("{}");
|
|
177
|
+
bt("{\n\n}");
|
|
178
|
+
bt("do { a(); } while ( 1 );", "do {\n a();\n} while (1);");
|
|
179
|
+
bt("do {} while (1);");
|
|
180
|
+
bt("do {\n} while (1);", "do {} while (1);");
|
|
181
|
+
bt("do {\n\n} while (1);");
|
|
182
|
+
bt("var a = x(a, b, c)");
|
|
183
|
+
bt("delete x if (a) b();", "delete x\nif (a) b();");
|
|
184
|
+
bt("delete x[x] if (a) b();", "delete x[x]\nif (a) b();");
|
|
185
|
+
bt("for(var a=1,b=2)", "for (var a = 1, b = 2)");
|
|
186
|
+
bt("for(var a=1,b=2,c=3)", "for (var a = 1, b = 2, c = 3)");
|
|
187
|
+
bt("for(var a=1,b=2,c=3;d<3;d++)", "for (var a = 1, b = 2, c = 3; d < 3; d++)");
|
|
188
|
+
bt("function x(){(a||b).c()}", "function x() {\n (a || b).c()\n}");
|
|
189
|
+
bt("function x(){return - 1}", "function x() {\n return -1\n}");
|
|
190
|
+
bt("function x(){return ! a}", "function x() {\n return !a\n}");
|
|
191
|
+
|
|
192
|
+
// a common snippet in jQuery plugins
|
|
193
|
+
bt("settings = $.extend({},defaults,settings);", "settings = $.extend({}, defaults, settings);");
|
|
194
|
+
|
|
195
|
+
bt('{xxx;}()', '{\n xxx;\n}()');
|
|
196
|
+
|
|
197
|
+
bt("a = 'a'\nb = 'b'");
|
|
198
|
+
bt("a = /reg/exp");
|
|
199
|
+
bt("a = /reg/");
|
|
200
|
+
bt('/abc/.test()');
|
|
201
|
+
bt('/abc/i.test()');
|
|
202
|
+
bt("{/abc/i.test()}", "{\n /abc/i.test()\n}");
|
|
203
|
+
bt('var x=(a)/a;', 'var x = (a) / a;');
|
|
204
|
+
|
|
205
|
+
bt('x != -1', 'x != -1');
|
|
206
|
+
|
|
207
|
+
bt('for (; s-->0;)', 'for (; s-- > 0;)');
|
|
208
|
+
bt('for (; s++>0;)', 'for (; s++ > 0;)');
|
|
209
|
+
bt('a = s++>s--;', 'a = s++ > s--;');
|
|
210
|
+
bt('a = s++>--s;', 'a = s++ > --s;');
|
|
211
|
+
|
|
212
|
+
bt('{x=#1=[]}', '{\n x = #1=[]\n}');
|
|
213
|
+
bt('{a:#1={}}', '{\n a: #1={}\n}');
|
|
214
|
+
bt('{a:#1#}', '{\n a: #1#\n}');
|
|
215
|
+
|
|
216
|
+
test_fragment('{a:1},{a:2}', '{\n a: 1\n}, {\n a: 2\n}');
|
|
217
|
+
test_fragment('var ary=[{a:1}, {a:2}];', 'var ary = [{\n a: 1\n}, {\n a: 2\n}];');
|
|
218
|
+
|
|
219
|
+
test_fragment('{a:#1', '{\n a: #1'); // incomplete
|
|
220
|
+
test_fragment('{a:#', '{\n a: #'); // incomplete
|
|
221
|
+
|
|
222
|
+
test_fragment('}}}', '}\n}\n}'); // incomplete
|
|
223
|
+
|
|
224
|
+
test_fragment('<!--\nvoid();\n// -->', '<!--\nvoid();\n// -->');
|
|
225
|
+
|
|
226
|
+
test_fragment('a=/regexp', 'a = /regexp'); // incomplete regexp
|
|
227
|
+
|
|
228
|
+
bt('{a:#1=[],b:#1#,c:#999999#}', '{\n a: #1=[],\n b: #1#,\n c: #999999#\n}');
|
|
229
|
+
|
|
230
|
+
bt("a = 1e+2");
|
|
231
|
+
bt("a = 1e-2");
|
|
232
|
+
bt("do{x()}while(a>1)", "do {\n x()\n} while (a > 1)");
|
|
233
|
+
|
|
234
|
+
bt("x(); /reg/exp.match(something)", "x();\n/reg/exp.match(something)");
|
|
235
|
+
|
|
236
|
+
test_fragment("something();(", "something();\n(");
|
|
237
|
+
test_fragment("#!she/bangs, she bangs\nf=1", "#!she/bangs, she bangs\n\nf = 1");
|
|
238
|
+
test_fragment("#!she/bangs, she bangs\n\nf=1", "#!she/bangs, she bangs\n\nf = 1");
|
|
239
|
+
test_fragment("#!she/bangs, she bangs\n\n/* comment */", "#!she/bangs, she bangs\n\n/* comment */");
|
|
240
|
+
test_fragment("#!she/bangs, she bangs\n\n\n/* comment */", "#!she/bangs, she bangs\n\n\n/* comment */");
|
|
241
|
+
test_fragment("#", "#");
|
|
242
|
+
test_fragment("#!", "#!");
|
|
243
|
+
|
|
244
|
+
bt("function namespace::something()");
|
|
245
|
+
|
|
246
|
+
test_fragment("<!--\nsomething();\n-->", "<!--\nsomething();\n-->");
|
|
247
|
+
test_fragment("<!--\nif(i<0){bla();}\n-->", "<!--\nif (i < 0) {\n bla();\n}\n-->");
|
|
248
|
+
|
|
249
|
+
bt('{foo();--bar;}', '{\n foo();\n --bar;\n}');
|
|
250
|
+
bt('{foo();++bar;}', '{\n foo();\n ++bar;\n}');
|
|
251
|
+
bt('{--bar;}', '{\n --bar;\n}');
|
|
252
|
+
bt('{++bar;}', '{\n ++bar;\n}');
|
|
253
|
+
|
|
254
|
+
// regexps
|
|
255
|
+
bt('a(/abc\\/\\/def/);b()', "a(/abc\\/\\/def/);\nb()");
|
|
256
|
+
bt('a(/a[b\\[\\]c]d/);b()', "a(/a[b\\[\\]c]d/);\nb()");
|
|
257
|
+
test_fragment('a(/a[b\\[', "a(/a[b\\["); // incomplete char class
|
|
258
|
+
// allow unescaped / in char classes
|
|
259
|
+
bt('a(/[a/b]/);b()', "a(/[a/b]/);\nb()");
|
|
260
|
+
|
|
261
|
+
bt('a=[[1,2],[4,5],[7,8]]', "a = [\n [1, 2],\n [4, 5],\n [7, 8]\n]");
|
|
262
|
+
bt('a=[a[1],b[4],c[d[7]]]', "a = [a[1], b[4], c[d[7]]]");
|
|
263
|
+
bt('[1,2,[3,4,[5,6],7],8]', "[1, 2, [3, 4, [5, 6], 7], 8]");
|
|
264
|
+
|
|
265
|
+
bt('[[["1","2"],["3","4"]],[["5","6","7"],["8","9","0"]],[["1","2","3"],["4","5","6","7"],["8","9","0"]]]',
|
|
266
|
+
'[\n [\n ["1", "2"],\n ["3", "4"]\n ],\n [\n ["5", "6", "7"],\n ["8", "9", "0"]\n ],\n [\n ["1", "2", "3"],\n ["4", "5", "6", "7"],\n ["8", "9", "0"]\n ]\n]');
|
|
267
|
+
|
|
268
|
+
bt('{[x()[0]];indent;}', '{\n [x()[0]];\n indent;\n}');
|
|
269
|
+
|
|
270
|
+
bt('return ++i', 'return ++i');
|
|
271
|
+
bt('return !!x', 'return !!x');
|
|
272
|
+
bt('return !x', 'return !x');
|
|
273
|
+
bt('return [1,2]', 'return [1, 2]');
|
|
274
|
+
bt('return;', 'return;');
|
|
275
|
+
bt('return\nfunc', 'return\nfunc');
|
|
276
|
+
bt('catch(e)', 'catch (e)');
|
|
277
|
+
|
|
278
|
+
bt('var a=1,b={foo:2,bar:3},c=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n },\n c = 4;');
|
|
279
|
+
|
|
280
|
+
// inline comment
|
|
281
|
+
bt('function x(/*int*/ start, /*string*/ foo)', 'function x( /*int*/ start, /*string*/ foo)');
|
|
282
|
+
|
|
283
|
+
// javadoc comment
|
|
284
|
+
bt('/**\n* foo\n*/', '/**\n * foo\n */');
|
|
285
|
+
bt('{\n/**\n* foo\n*/\n}', '{\n /**\n * foo\n */\n}');
|
|
286
|
+
|
|
287
|
+
bt('var a,b,c=1,d,e,f=2;', 'var a, b, c = 1,\n d, e, f = 2;');
|
|
288
|
+
bt('var a,b,c=[],d,e,f=2;', 'var a, b, c = [],\n d, e, f = 2;');
|
|
289
|
+
|
|
290
|
+
bt('do/regexp/;\nwhile(1);', 'do /regexp/;\nwhile (1);'); // hmmm
|
|
291
|
+
|
|
292
|
+
bt('var a = a,\na;\nb = {\nb\n}', 'var a = a,\n a;\nb = {\n b\n}');
|
|
293
|
+
|
|
294
|
+
bt('var a = a,\n /* c */\n b;');
|
|
295
|
+
bt('var a = a,\n // c\n b;');
|
|
296
|
+
|
|
297
|
+
bt('foo.("bar");'); // weird element referencing
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
bt('if (a) a()\nelse b()\nnewline()');
|
|
301
|
+
bt('if (a) a()\nnewline()');
|
|
302
|
+
bt('a=typeof(x)', 'a = typeof(x)');
|
|
303
|
+
bt('var a = function() {\n return null;\n },\n b = false;');
|
|
304
|
+
|
|
305
|
+
bt('var a = function() {\n func1()\n }');
|
|
306
|
+
bt('var a = function() {\n func1()\n }\nvar b = function() {\n func2()\n }');
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
opts.jslint_happy = true;
|
|
311
|
+
|
|
312
|
+
bt('a=typeof(x)', 'a = typeof (x)');
|
|
313
|
+
bt('x();\n\nfunction(){}', 'x();\n\nfunction () {}');
|
|
314
|
+
bt('function () {\n var a, b, c, d, e = [],\n f;\n}');
|
|
315
|
+
test_fragment("// comment 1\n(function()", "// comment 1\n(function ()"); // typical greasemonkey start
|
|
316
|
+
bt("var a1, b1, c1, d1 = 0, c = function() {}, d = '';", "var a1, b1, c1, d1 = 0,\n c = function () {},\n d = '';");
|
|
317
|
+
bt('var o1=$.extend(a);function(){alert(x);}', 'var o1 = $.extend(a);\n\nfunction () {\n alert(x);\n}');
|
|
318
|
+
|
|
319
|
+
opts.jslint_happy = false;
|
|
320
|
+
|
|
321
|
+
test_fragment("// comment 2\n(function()", "// comment 2\n(function()"); // typical greasemonkey start
|
|
322
|
+
bt("var a2, b2, c2, d2 = 0, c = function() {}, d = '';", "var a2, b2, c2, d2 = 0,\n c = function() {},\n d = '';");
|
|
323
|
+
bt('var o2=$.extend(a);function(){alert(x);}', 'var o2 = $.extend(a);\n\nfunction() {\n alert(x);\n}');
|
|
324
|
+
|
|
325
|
+
bt('{"x":[{"a":1,"b":3},7,8,8,8,8,{"b":99},{"a":11}]}', '{\n "x": [{\n "a": 1,\n "b": 3\n },\n 7, 8, 8, 8, 8,\n {\n "b": 99\n }, {\n "a": 11\n }]\n}');
|
|
326
|
+
|
|
327
|
+
bt('{"1":{"1a":"1b"},"2"}', '{\n "1": {\n "1a": "1b"\n },\n "2"\n}');
|
|
328
|
+
bt('{a:{a:b},c}', '{\n a: {\n a: b\n },\n c\n}');
|
|
329
|
+
|
|
330
|
+
bt('{[y[a]];keep_indent;}', '{\n [y[a]];\n keep_indent;\n}');
|
|
331
|
+
|
|
332
|
+
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}');
|
|
333
|
+
|
|
334
|
+
bt('if (foo) one()\ntwo()\nthree()');
|
|
335
|
+
bt('if (1 + foo() && bar(baz()) / 2) one()\ntwo()\nthree()');
|
|
336
|
+
bt('if (1 + foo() && bar(baz()) / 2) one();\ntwo();\nthree();');
|
|
337
|
+
|
|
338
|
+
opts.indent_size = 1;
|
|
339
|
+
opts.indent_char = ' ';
|
|
340
|
+
bt('{ one_char() }', "{\n one_char()\n}");
|
|
341
|
+
|
|
342
|
+
bt('var a,b=1,c=2', 'var a, b = 1,\n c = 2');
|
|
343
|
+
|
|
344
|
+
opts.indent_size = 4;
|
|
345
|
+
opts.indent_char = ' ';
|
|
346
|
+
bt('{ one_char() }', "{\n one_char()\n}");
|
|
347
|
+
|
|
348
|
+
opts.indent_size = 1;
|
|
349
|
+
opts.indent_char = "\t";
|
|
350
|
+
bt('{ one_char() }', "{\n\tone_char()\n}");
|
|
351
|
+
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;');
|
|
352
|
+
|
|
353
|
+
opts.indent_size = 4;
|
|
354
|
+
opts.indent_char = ' ';
|
|
355
|
+
|
|
356
|
+
opts.preserve_newlines = false;
|
|
357
|
+
bt('var\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;');
|
|
358
|
+
|
|
359
|
+
// make sure the blank line between function definitions stays
|
|
360
|
+
// even when preserve_newlines = false
|
|
361
|
+
bt('function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}');
|
|
362
|
+
bt('function foo() {\n return 1;\n}\nfunction foo() {\n return 1;\n}',
|
|
363
|
+
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
|
|
364
|
+
);
|
|
365
|
+
bt('function foo() {\n return 1;\n}\n\n\nfunction foo() {\n return 1;\n}',
|
|
366
|
+
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
opts.preserve_newlines = true;
|
|
371
|
+
bt('var\na=do_preserve_newlines;', 'var\na = do_preserve_newlines;');
|
|
372
|
+
bt('// a\n// b\n\n// c\n// d');
|
|
373
|
+
bt('if (foo) // comment\n{\n bar();\n}');
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
opts.keep_array_indentation = true;
|
|
377
|
+
|
|
378
|
+
test_fragment('var a = [\n// comment:\n{\n foo:bar\n}\n];', 'var a = [\n // comment:\n{\n foo: bar\n}\n];');
|
|
379
|
+
|
|
380
|
+
bt('var x = [{}\n]', 'var x = [{}\n]');
|
|
381
|
+
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n}\n]');
|
|
382
|
+
bt("a = ['something',\n'completely',\n'different'];\nif (x);", "a = ['something',\n 'completely',\n 'different'];\nif (x);");
|
|
383
|
+
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']");
|
|
384
|
+
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']");
|
|
385
|
+
|
|
386
|
+
bt("x = [{'a':0}]", "x = [{\n 'a': 0\n}]");
|
|
387
|
+
|
|
388
|
+
bt('{a([[a1]], {b;});}', '{\n a([[a1]], {\n b;\n });\n}');
|
|
389
|
+
|
|
390
|
+
bt('a = //comment\n/regex/;');
|
|
391
|
+
|
|
392
|
+
test_fragment('/*\n * X\n */');
|
|
393
|
+
test_fragment('/*\r\n * X\r\n */', '/*\n * X\n */');
|
|
394
|
+
|
|
395
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}');
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
opts.brace_style = 'expand';
|
|
399
|
+
|
|
400
|
+
bt('var a=1,b={foo:2,bar:3},c=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n },\n c = 4;');
|
|
401
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}');
|
|
402
|
+
test_fragment('if (foo) {', 'if (foo)\n{');
|
|
403
|
+
test_fragment('foo {', 'foo\n{');
|
|
404
|
+
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report.
|
|
405
|
+
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway.
|
|
406
|
+
test_fragment('return;\n{', 'return;\n{');
|
|
407
|
+
bt("throw {}");
|
|
408
|
+
bt("throw {\n foo;\n}");
|
|
409
|
+
|
|
410
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}');
|
|
411
|
+
bt('var foo = {}');
|
|
412
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}');
|
|
413
|
+
test_fragment('if (foo) {', 'if (foo)\n{');
|
|
414
|
+
test_fragment('foo {', 'foo\n{');
|
|
415
|
+
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report.
|
|
416
|
+
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway.
|
|
417
|
+
test_fragment('return;\n{', 'return;\n{');
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
opts.brace_style = 'collapse';
|
|
421
|
+
|
|
422
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}');
|
|
423
|
+
test_fragment('if (foo) {', 'if (foo) {');
|
|
424
|
+
test_fragment('foo {', 'foo {');
|
|
425
|
+
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report.
|
|
426
|
+
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway.
|
|
427
|
+
test_fragment('return;\n{', 'return; {');
|
|
428
|
+
|
|
429
|
+
bt('if (foo) bar();\nelse break');
|
|
430
|
+
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz');
|
|
431
|
+
bt('a: do {} while (); xxx', 'a: do {} while ();\nxxx');
|
|
432
|
+
|
|
433
|
+
bt('var a = new function();');
|
|
434
|
+
test_fragment('new function');
|
|
435
|
+
bt('var a =\nfoo', 'var a = foo');
|
|
436
|
+
|
|
437
|
+
opts.brace_style = "end-expand";
|
|
438
|
+
|
|
439
|
+
bt('if(1){2}else{3}', "if (1) {\n 2\n}\nelse {\n 3\n}");
|
|
440
|
+
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n}\ncatch (b) {\n c();\n}\nfinally {\n d();\n}");
|
|
441
|
+
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n}\nelse if (c) foo();");
|
|
442
|
+
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n}\nelse {\n // comment\n}"); // if/else statement with empty body
|
|
443
|
+
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n}\nelse {\n if (x) {\n y\n }\n}');
|
|
444
|
+
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n}\nelse {\n c;\n}');
|
|
445
|
+
|
|
446
|
+
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}', ' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }')
|
|
447
|
+
|
|
448
|
+
bt('if (foo) {}\nelse /regex/.test();');
|
|
449
|
+
// bt('if (foo) /regex/.test();'); // doesn't work, detects as a division. should it work?
|
|
450
|
+
|
|
451
|
+
bt('a = <?= external() ?> ;'); // not the most perfect thing in the world, but you're the weirdo beaufifying php mix-ins with javascript beautifier
|
|
452
|
+
bt('a = <%= external() %> ;');
|
|
453
|
+
|
|
454
|
+
bt('// func-comment\n\nfunction foo() {}\n\n// end-func-comment', '// func-comment\nfunction foo() {}\n\n// end-func-comment');
|
|
455
|
+
|
|
456
|
+
test_fragment('roo = {\n /*\n ****\n FOO\n ****\n */\n BAR: 0\n};');
|
|
457
|
+
|
|
458
|
+
bt('"foo""bar""baz"', '"foo"\n"bar"\n"baz"');
|
|
459
|
+
bt("'foo''bar''baz'", "'foo'\n'bar'\n'baz'");
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
test_fragment("if (..) {\n // ....\n}\n(function");
|
|
463
|
+
|
|
464
|
+
bt("{\n get foo() {}\n}");
|
|
465
|
+
bt("{\n var a = get\n foo();\n}");
|
|
466
|
+
bt("{\n set foo() {}\n}");
|
|
467
|
+
bt("{\n var a = set\n foo();\n}");
|
|
468
|
+
bt("var x = {\n get function()\n}");
|
|
469
|
+
bt("var x = {\n set function()\n}");
|
|
470
|
+
bt("var x = set\n\nfunction() {}");
|
|
471
|
+
|
|
472
|
+
bt('<!-- foo\nbar();\n-->');
|
|
473
|
+
bt('<!-- dont crash');
|
|
474
|
+
bt('for () /abc/.test()');
|
|
475
|
+
bt('if (k) /aaa/m.test(v) && l();');
|
|
476
|
+
bt('switch (true) {\ncase /swf/i.test(foo):\n bar();\n}');
|
|
477
|
+
bt('createdAt = {\n type: Date,\n default: Date.now\n}');
|
|
478
|
+
bt('switch (createdAt) {\ncase a:\n Date,\ndefault:\n Date.now\n}');
|
|
479
|
+
opts.space_before_conditional = false;
|
|
480
|
+
bt('if(a) b()');
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
bt('3.*7;', '3. * 7;')
|
|
484
|
+
bt('import foo.*;', 'import foo.*;') // actionscript's import
|
|
485
|
+
test_fragment('function f(a: a, b: b)') // actionscript
|
|
486
|
+
|
|
487
|
+
return sanitytest;
|
|
488
|
+
}
|
|
489
|
+
|