(function () { /* Imports */ var Meteor = Package.meteor.Meteor; var HTML = Package.htmljs.HTML; var _ = Package.underscore._; /* Package-scope variables */ var BlazeTools, toJSLiteral, toObjectLiteralKey, ToJSVisitor; (function(){ /////////////////////////////////////////////////////////////////////////////////////// // // // packages/blaze-tools/preamble.js // // // /////////////////////////////////////////////////////////////////////////////////////// // BlazeTools = {}; // 1 // 2 /////////////////////////////////////////////////////////////////////////////////////// }).call(this); (function(){ /////////////////////////////////////////////////////////////////////////////////////// // // // packages/blaze-tools/tokens.js // // // /////////////////////////////////////////////////////////////////////////////////////// // // 1 // Adapted from source code of http://xregexp.com/plugins/#unicode // 2 var unicodeCategories = { // 3 Ll: "0061-007A00B500DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F05210523052505270561-05871D00-1D2B1D6B-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7B2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2CF32D00-2D252D272D2DA641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA661A663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CA78EA791A793A7A1A7A3A7A5A7A7A7A9A7FAFB00-FB06FB13-FB17FF41-FF5A", Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D6A1D781D9B-1DBF2071207F2090-209C2C7C2C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A7F8A7F9A9CFAA70AADDAAF3AAF4FF70FF9EFF9F", Lo: "00AA00BA01BB01C0-01C3029405D0-05EA05F0-05F20620-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150840-085808A008A2-08AC0904-0939093D09500958-09610972-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA10FD-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF11CF51CF62135-21382D30-2D672D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCAAE0-AAEAAAF2AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", // 7 Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E05200522052405260531-055610A0-10C510C710CD1E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CED2CF2A640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA660A662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BA78DA790A792A7A0A7A2A7A4A7A6A7A8A7AAFF21-FF3A", Mc: "0903093B093E-09400949-094C094E094F0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1BAC1BAD1BE71BEA-1BEC1BEE1BF21BF31C24-1C2B1C341C351CE11CF21CF3302E302FA823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BAAEBAAEEAAEFAAF5ABE3ABE4ABE6ABE7ABE9ABEAABEC", Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065F067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0859-085B08E4-08FE0900-0902093A093C0941-0948094D0951-095709620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F8D-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135D-135F1712-17141732-1734175217531772177317B417B517B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91BAB1BE61BE81BE91BED1BEF-1BF11C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1CF41DC0-1DE61DFC-1DFF20D0-20DC20E120E5-20F02CEF-2CF12D7F2DE0-2DFF302A-302D3099309AA66FA674-A67DA69FA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1AAECAAEDAAF6ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19D91A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", // 12 Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F" // 13 }; // 14 // 15 var unicodeClass = function (abbrev) { // 16 return '[' + // 17 unicodeCategories[abbrev].replace(/[0-9A-F]{4}/ig, "\\u$&") + ']'; // 18 }; // 19 // 20 // See ECMA-262 spec, 3rd edition, Section 7.6 // 21 // Match one or more characters that can start an identifier. // 22 // This is IdentifierStart+. // 23 var rIdentifierPrefix = new RegExp( // 24 "^([a-zA-Z$_]+|\\\\u[0-9a-fA-F]{4}|" + // 25 [unicodeClass('Lu'), unicodeClass('Ll'), unicodeClass('Lt'), // 26 unicodeClass('Lm'), unicodeClass('Lo'), unicodeClass('Nl')].join('|') + // 27 ")+"); // 28 // Match one or more characters that can continue an identifier. // 29 // This is (IdentifierPart and not IdentifierStart)+. // 30 // To match a full identifier, match rIdentifierPrefix, then // 31 // match rIdentifierMiddle followed by rIdentifierPrefix until they both fail. // 32 var rIdentifierMiddle = new RegExp( // 33 "^([0-9]|" + [unicodeClass('Mn'), unicodeClass('Mc'), unicodeClass('Nd'), // 34 unicodeClass('Pc')].join('|') + ")+"); // 35 // 36 // 37 // See ECMA-262 spec, 3rd edition, Section 7.8.3 // 38 var rHexLiteral = /^0[xX][0-9a-fA-F]+(?!\w)/; // 39 var rDecLiteral = // 40 /^(((0|[1-9][0-9]*)(\.[0-9]*)?)|\.[0-9]+)([Ee][+-]?[0-9]+)?(?!\w)/; // 41 // 42 // Section 7.8.4 // 43 var rStringQuote = /^["']/; // 44 // Match one or more characters besides quotes, backslashes, or line ends // 45 var rStringMiddle = /^(?=.)[^"'\\]+?((?!.)|(?=["'\\]))/; // 46 // Match one escape sequence, including the backslash. // 47 var rEscapeSequence = // 48 /^\\(['"\\bfnrtv]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|(?=.)[^ux0-9])/; // 49 // Match one ES5 line continuation // 50 var rLineContinuation = // 51 /^\\(\r\n|[\u000A\u000D\u2028\u2029])/; // 52 // 53 // 54 BlazeTools.parseNumber = function (scanner) { // 55 var startPos = scanner.pos; // 56 // 57 var isNegative = false; // 58 if (scanner.peek() === '-') { // 59 scanner.pos++; // 60 isNegative = true; // 61 } // 62 // Note that we allow `"-0xa"`, unlike `Number(...)`. // 63 // 64 var rest = scanner.rest(); // 65 var match = rDecLiteral.exec(rest) || rHexLiteral.exec(rest); // 66 if (! match) { // 67 scanner.pos = startPos; // 68 return null; // 69 } // 70 var matchText = match[0]; // 71 scanner.pos += matchText.length; // 72 // 73 var text = (isNegative ? '-' : '') + matchText; // 74 var value = Number(matchText); // 75 value = (isNegative ? -value : value); // 76 return { text: text, value: value }; // 77 }; // 78 // 79 BlazeTools.parseIdentifierName = function (scanner) { // 80 var startPos = scanner.pos; // 81 var rest = scanner.rest(); // 82 var match = rIdentifierPrefix.exec(rest); // 83 if (! match) // 84 return null; // 85 scanner.pos += match[0].length; // 86 rest = scanner.rest(); // 87 var foundMore = true; // 88 // 89 while (foundMore) { // 90 foundMore = false; // 91 // 92 match = rIdentifierMiddle.exec(rest); // 93 if (match) { // 94 foundMore = true; // 95 scanner.pos += match[0].length; // 96 rest = scanner.rest(); // 97 } // 98 // 99 match = rIdentifierPrefix.exec(rest); // 100 if (match) { // 101 foundMore = true; // 102 scanner.pos += match[0].length; // 103 rest = scanner.rest(); // 104 } // 105 } // 106 // 107 return scanner.input.substring(startPos, scanner.pos); // 108 }; // 109 // 110 BlazeTools.parseExtendedIdentifierName = function (scanner) { // 111 // parse an identifier name optionally preceded by '@' // 112 if (scanner.peek() === '@') { // 113 scanner.pos++; // 114 var afterAt = BlazeTools.parseIdentifierName(scanner); // 115 if (afterAt) { // 116 return '@' + afterAt; // 117 } else { // 118 scanner.pos--; // 119 return null; // 120 } // 121 } else { // 122 return BlazeTools.parseIdentifierName(scanner); // 123 } // 124 }; // 125 // 126 BlazeTools.parseStringLiteral = function (scanner) { // 127 var startPos = scanner.pos; // 128 var rest = scanner.rest(); // 129 var match = rStringQuote.exec(rest); // 130 if (! match) // 131 return null; // 132 // 133 var quote = match[0]; // 134 scanner.pos++; // 135 rest = scanner.rest(); // 136 // 137 var jsonLiteral = '"'; // 138 // 139 while (match) { // 140 match = rStringMiddle.exec(rest); // 141 if (match) { // 142 jsonLiteral += match[0]; // 143 } else { // 144 match = rEscapeSequence.exec(rest); // 145 if (match) { // 146 var esc = match[0]; // 147 // Convert all string escapes to JSON-compatible string escapes, so we // 148 // can use JSON.parse for some of the work. JSON strings are not the // 149 // same as JS strings. They don't support `\0`, `\v`, `\'`, or hex // 150 // escapes. // 151 if (esc === '\\0') // 152 jsonLiteral += '\\u0000'; // 153 else if (esc === '\\v') // 154 // Note: IE 8 doesn't correctly parse '\v' in JavaScript. // 155 jsonLiteral += '\\u000b'; // 156 else if (esc.charAt(1) === 'x') // 157 jsonLiteral += '\\u00' + esc.slice(2); // 158 else if (esc === '\\\'') // 159 jsonLiteral += "'"; // 160 else // 161 jsonLiteral += esc; // 162 } else { // 163 match = rLineContinuation.exec(rest); // 164 if (! match) { // 165 match = rStringQuote.exec(rest); // 166 if (match) { // 167 var c = match[0]; // 168 if (c !== quote) { // 169 if (c === '"') // 170 jsonLiteral += '\\'; // 171 jsonLiteral += c; // 172 } // 173 } // 174 } // 175 } // 176 } // 177 if (match) { // 178 scanner.pos += match[0].length; // 179 rest = scanner.rest(); // 180 if (match[0] === quote) // 181 break; // 182 } // 183 } // 184 // 185 if (! match || match[0] !== quote) // 186 scanner.fatal("Unterminated string literal"); // 187 // 188 jsonLiteral += '"'; // 189 var text = scanner.input.substring(startPos, scanner.pos); // 190 var value = JSON.parse(jsonLiteral); // 191 return { text: text, value: value }; // 192 }; // 193 // 194 /////////////////////////////////////////////////////////////////////////////////////// }).call(this); (function(){ /////////////////////////////////////////////////////////////////////////////////////// // // // packages/blaze-tools/tojs.js // // // /////////////////////////////////////////////////////////////////////////////////////// // // 1 BlazeTools.EmitCode = function (value) { // 2 if (! (this instanceof BlazeTools.EmitCode)) // 3 // called without `new` // 4 return new BlazeTools.EmitCode(value); // 5 // 6 if (typeof value !== 'string') // 7 throw new Error('BlazeTools.EmitCode must be constructed with a string'); // 8 // 9 this.value = value; // 10 }; // 11 BlazeTools.EmitCode.prototype.toJS = function (visitor) { // 12 return this.value; // 13 }; // 14 // 15 // Turns any JSONable value into a JavaScript literal. // 16 toJSLiteral = function (obj) { // 17 // See <http://timelessrepo.com/json-isnt-a-javascript-subset> for `\u2028\u2029`. // Also escape Unicode surrogates. // 19 return (JSON.stringify(obj) // 20 .replace(/[\u2028\u2029\ud800-\udfff]/g, function (c) { // 21 return '\\u' + ('000' + c.charCodeAt(0).toString(16)).slice(-4); // 22 })); // 23 }; // 24 BlazeTools.toJSLiteral = toJSLiteral; // 25 // 26 // 27 // 28 var jsReservedWordSet = (function (set) { // 29 _.each("abstract else instanceof super boolean enum int switch break export interface synchronized byte extends let this case false long throw catch final native throws char finally new transient class float null true const for package try continue function private typeof debugger goto protected var default if public void delete implements return volatile do import short while double in static with".split(' '), function (w) { set[w] = 1; // 31 }); // 32 return set; // 33 })({}); // 34 // 35 toObjectLiteralKey = function (k) { // 36 if (/^[a-zA-Z$_][a-zA-Z$0-9_]*$/.test(k) && jsReservedWordSet[k] !== 1) // 37 return k; // 38 return toJSLiteral(k); // 39 }; // 40 BlazeTools.toObjectLiteralKey = toObjectLiteralKey; // 41 // 42 var hasToJS = function (x) { // 43 return x.toJS && (typeof (x.toJS) === 'function'); // 44 }; // 45 // 46 ToJSVisitor = HTML.Visitor.extend(); // 47 ToJSVisitor.def({ // 48 visitNull: function (nullOrUndefined) { // 49 return 'null'; // 50 }, // 51 visitPrimitive: function (stringBooleanOrNumber) { // 52 return toJSLiteral(stringBooleanOrNumber); // 53 }, // 54 visitArray: function (array) { // 55 var parts = []; // 56 for (var i = 0; i < array.length; i++) // 57 parts.push(this.visit(array[i])); // 58 return '[' + parts.join(', ') + ']'; // 59 }, // 60 visitTag: function (tag) { // 61 return this.generateCall(tag.tagName, tag.attrs, tag.children); // 62 }, // 63 visitComment: function (comment) { // 64 return this.generateCall('HTML.Comment', null, [comment.value]); // 65 }, // 66 visitCharRef: function (charRef) { // 67 return this.generateCall('HTML.CharRef', // 68 {html: charRef.html, str: charRef.str}); // 69 }, // 70 visitRaw: function (raw) { // 71 return this.generateCall('HTML.Raw', null, [raw.value]); // 72 }, // 73 visitObject: function (x) { // 74 if (hasToJS(x)) { // 75 return x.toJS(this); // 76 } // 77 // 78 throw new Error("Unexpected object in HTMLjs in toJS: " + x); // 79 }, // 80 generateCall: function (name, attrs, children) { // 81 var tagSymbol; // 82 if (name.indexOf('.') >= 0) { // 83 tagSymbol = name; // 84 } else if (HTML.isTagEnsured(name)) { // 85 tagSymbol = 'HTML.' + HTML.getSymbolName(name); // 86 } else { // 87 tagSymbol = 'HTML.getTag(' + toJSLiteral(name) + ')'; // 88 } // 89 // 90 var attrsArray = null; // 91 if (attrs) { // 92 attrsArray = []; // 93 var needsHTMLAttrs = false; // 94 if (HTML.isArray(attrs)) { // 95 var attrsArray = []; // 96 for (var i = 0; i < attrs.length; i++) { // 97 var a = attrs[i]; // 98 if (hasToJS(a)) { // 99 attrsArray.push(a.toJS(this)); // 100 needsHTMLAttrs = true; // 101 } else { // 102 var attrsObjStr = this.generateAttrsDictionary(attrs[i]); // 103 if (attrsObjStr !== null) // 104 attrsArray.push(attrsObjStr); // 105 } // 106 } // 107 } else if (hasToJS(attrs)) { // 108 attrsArray.push(attrs.toJS(this)); // 109 needsHTMLAttrs = true; // 110 } else { // 111 attrsArray.push(this.generateAttrsDictionary(attrs)); // 112 } // 113 } // 114 var attrsStr = null; // 115 if (attrsArray && attrsArray.length) { // 116 if (attrsArray.length === 1 && ! needsHTMLAttrs) { // 117 attrsStr = attrsArray[0]; // 118 } else { // 119 attrsStr = 'HTML.Attrs(' + attrsArray.join(', ') + ')'; // 120 } // 121 } // 122 // 123 var argStrs = []; // 124 if (attrsStr !== null) // 125 argStrs.push(attrsStr); // 126 // 127 if (children) { // 128 for (var i = 0; i < children.length; i++) // 129 argStrs.push(this.visit(children[i])); // 130 } // 131 // 132 return tagSymbol + '(' + argStrs.join(', ') + ')'; // 133 }, // 134 generateAttrsDictionary: function (attrsDict) { // 135 if (attrsDict.toJS && (typeof (attrsDict.toJS) === 'function')) { // 136 // not an attrs dictionary, but something else! Like a template tag. // 137 return attrsDict.toJS(this); // 138 } // 139 // 140 var kvStrs = []; // 141 for (var k in attrsDict) { // 142 if (! HTML.isNully(attrsDict[k])) // 143 kvStrs.push(toObjectLiteralKey(k) + ': ' + // 144 this.visit(attrsDict[k])); // 145 } // 146 if (kvStrs.length) // 147 return '{' + kvStrs.join(', ') + '}'; // 148 return null; // 149 } // 150 }); // 151 BlazeTools.ToJSVisitor = ToJSVisitor; // 152 // 153 BlazeTools.toJS = function (content) { // 154 return (new ToJSVisitor).visit(content); // 155 }; // 156 // 157 /////////////////////////////////////////////////////////////////////////////////////// }).call(this); /* Exports */ if (typeof Package === 'undefined') Package = {}; Package['blaze-tools'] = { BlazeTools: BlazeTools }; })(); //# sourceMappingURL=blaze-tools.js.map