diff --git a/packages/blaze-tools/package.js b/packages/blaze-tools/package.js index 394c8293c..9326f9e0c 100644 --- a/packages/blaze-tools/package.js +++ b/packages/blaze-tools/package.js @@ -6,7 +6,7 @@ Package.describe({ }); Package.onUse(function (api) { - api.use('ecmascript@0.15.1'); + api.use('ecmascript@0.16.7'); api.use('htmljs@1.2.0'); api.export('BlazeTools'); @@ -14,7 +14,7 @@ Package.onUse(function (api) { }); Package.onTest(function (api) { - api.use('tinytest@1.1.0'); + api.use('tinytest@1.2.2'); api.use('ecmascript'); api.use('blaze-tools'); diff --git a/packages/blaze-tools/tojs.js b/packages/blaze-tools/tojs.js index d50bce98c..09beae311 100644 --- a/packages/blaze-tools/tojs.js +++ b/packages/blaze-tools/tojs.js @@ -28,7 +28,7 @@ export function toJSLiteral (obj) { -var jsReservedWordSet = (function (set) { +const jsReservedWordSet = (function (set) { "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(' ').forEach(function (w) { set[w] = 1; }); @@ -41,7 +41,7 @@ export function toObjectLiteralKey (k) { return toJSLiteral(k); } -var hasToJS = function (x) { +const hasToJS = function (x) { return x.toJS && (typeof (x.toJS) === 'function'); }; @@ -54,8 +54,8 @@ ToJSVisitor.def({ return toJSLiteral(stringBooleanOrNumber); }, visitArray: function (array) { - var parts = []; - for (var i = 0; i < array.length; i++) + const parts = []; + for (let i = 0; i < array.length; i++) parts.push(this.visit(array[i])); return '[' + parts.join(', ') + ']'; }, @@ -80,7 +80,7 @@ ToJSVisitor.def({ throw new Error("Unexpected object in HTMLjs in toJS: " + x); }, generateCall: function (name, attrs, children) { - var tagSymbol; + let tagSymbol; if (name.indexOf('.') >= 0) { tagSymbol = name; } else if (HTML.isTagEnsured(name)) { @@ -89,19 +89,19 @@ ToJSVisitor.def({ tagSymbol = 'HTML.getTag(' + toJSLiteral(name) + ')'; } - var attrsArray = null; + let attrsArray = null; + let needsHTMLAttrs = false; if (attrs) { attrsArray = []; - var needsHTMLAttrs = false; if (HTML.isArray(attrs)) { - var attrsArray = []; - for (var i = 0; i < attrs.length; i++) { - var a = attrs[i]; + attrsArray = []; + for (let i = 0; i < attrs.length; i++) { + const a = attrs[i]; if (hasToJS(a)) { attrsArray.push(a.toJS(this)); needsHTMLAttrs = true; } else { - var attrsObjStr = this.generateAttrsDictionary(attrs[i]); + const attrsObjStr = this.generateAttrsDictionary(attrs[i]); if (attrsObjStr !== null) attrsArray.push(attrsObjStr); } @@ -113,7 +113,7 @@ ToJSVisitor.def({ attrsArray.push(this.generateAttrsDictionary(attrs)); } } - var attrsStr = null; + let attrsStr = null; if (attrsArray && attrsArray.length) { if (attrsArray.length === 1 && ! needsHTMLAttrs) { attrsStr = attrsArray[0]; @@ -122,12 +122,12 @@ ToJSVisitor.def({ } } - var argStrs = []; + const argStrs = []; if (attrsStr !== null) argStrs.push(attrsStr); if (children) { - for (var i = 0; i < children.length; i++) + for (let i = 0; i < children.length; i++) argStrs.push(this.visit(children[i])); } @@ -139,12 +139,12 @@ ToJSVisitor.def({ return attrsDict.toJS(this); } - var kvStrs = []; - for (var k in attrsDict) { + const kvStrs = []; + Object.getOwnPropertyNames(attrsDict).forEach((k) => { if (! HTML.isNully(attrsDict[k])) kvStrs.push(toObjectLiteralKey(k) + ': ' + this.visit(attrsDict[k])); - } + }); if (kvStrs.length) return '{' + kvStrs.join(', ') + '}'; return null; diff --git a/packages/blaze-tools/token_tests.js b/packages/blaze-tools/token_tests.js index 530be1dd3..c2e7d30b0 100644 --- a/packages/blaze-tools/token_tests.js +++ b/packages/blaze-tools/token_tests.js @@ -3,11 +3,11 @@ import { HTMLTools } from 'meteor/html-tools'; Tinytest.add("blaze-tools - token parsers", function (test) { - var run = function (func, input, expected) { - var scanner = new HTMLTools.Scanner('z' + input); + const run = function (func, input, expected) { + const scanner = new HTMLTools.Scanner('z' + input); // make sure the parse function respects `scanner.pos` scanner.pos = 1; - var result = func(scanner); + const result = func(scanner); if (expected === null) { test.equal(scanner.pos, 1); test.equal(result, null); @@ -17,8 +17,8 @@ Tinytest.add("blaze-tools - token parsers", function (test) { } }; - var runValue = function (func, input, expectedValue) { - var expected; + const runValue = function (func, input, expectedValue) { + let expected; if (expectedValue === null) expected = null; else @@ -26,10 +26,10 @@ Tinytest.add("blaze-tools - token parsers", function (test) { run(func, input, expected); }; - var parseNumber = BlazeTools.parseNumber; - var parseIdentifierName = BlazeTools.parseIdentifierName; - var parseExtendedIdentifierName = BlazeTools.parseExtendedIdentifierName; - var parseStringLiteral = BlazeTools.parseStringLiteral; + const parseNumber = BlazeTools.parseNumber; + const parseIdentifierName = BlazeTools.parseIdentifierName; + const parseExtendedIdentifierName = BlazeTools.parseExtendedIdentifierName; + const parseStringLiteral = BlazeTools.parseStringLiteral; runValue(parseNumber, "0", 0); runValue(parseNumber, "-0", 0); diff --git a/packages/blaze-tools/tokens.js b/packages/blaze-tools/tokens.js index 3f13d6793..3b965e9e3 100644 --- a/packages/blaze-tools/tokens.js +++ b/packages/blaze-tools/tokens.js @@ -1,6 +1,6 @@ // Adapted from source code of http://xregexp.com/plugins/#unicode -var unicodeCategories = { +const unicodeCategories = { 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", @@ -13,7 +13,7 @@ var unicodeCategories = { Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F" }; -var unicodeClass = function (abbrev) { +const unicodeClass = function (abbrev) { return '[' + unicodeCategories[abbrev].replace(/[0-9A-F]{4}/ig, "\\u$&") + ']'; }; @@ -21,7 +21,7 @@ var unicodeClass = function (abbrev) { // See ECMA-262 spec, 3rd edition, Section 7.6 // Match one or more characters that can start an identifier. // This is IdentifierStart+. -var rIdentifierPrefix = new RegExp( +const rIdentifierPrefix = new RegExp( "^([a-zA-Z$_]+|\\\\u[0-9a-fA-F]{4}|" + [unicodeClass('Lu'), unicodeClass('Ll'), unicodeClass('Lt'), unicodeClass('Lm'), unicodeClass('Lo'), unicodeClass('Nl')].join('|') + @@ -30,62 +30,62 @@ var rIdentifierPrefix = new RegExp( // This is (IdentifierPart and not IdentifierStart)+. // To match a full identifier, match rIdentifierPrefix, then // match rIdentifierMiddle followed by rIdentifierPrefix until they both fail. -var rIdentifierMiddle = new RegExp( +const rIdentifierMiddle = new RegExp( "^([0-9]|" + [unicodeClass('Mn'), unicodeClass('Mc'), unicodeClass('Nd'), unicodeClass('Pc')].join('|') + ")+"); // See ECMA-262 spec, 3rd edition, Section 7.8.3 -var rHexLiteral = /^0[xX][0-9a-fA-F]+(?!\w)/; -var rDecLiteral = +const rHexLiteral = /^0[xX][0-9a-fA-F]+(?!\w)/; +const rDecLiteral = /^(((0|[1-9][0-9]*)(\.[0-9]*)?)|\.[0-9]+)([Ee][+-]?[0-9]+)?(?!\w)/; // Section 7.8.4 -var rStringQuote = /^["']/; +const rStringQuote = /^["']/; // Match one or more characters besides quotes, backslashes, or line ends -var rStringMiddle = /^(?=.)[^"'\\]+?((?!.)|(?=["'\\]))/; +const rStringMiddle = /^(?=.)[^"'\\]+?((?!.)|(?=["'\\]))/; // Match one escape sequence, including the backslash. -var rEscapeSequence = +const rEscapeSequence = /^\\(['"\\bfnrtv]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|(?=.)[^ux0-9])/; // Match one ES5 line continuation -var rLineContinuation = +const rLineContinuation = /^\\(\r\n|[\u000A\u000D\u2028\u2029])/; export function parseNumber (scanner) { - var startPos = scanner.pos; + const startPos = scanner.pos; - var isNegative = false; + let isNegative = false; if (scanner.peek() === '-') { scanner.pos++; isNegative = true; } // Note that we allow `"-0xa"`, unlike `Number(...)`. - var rest = scanner.rest(); - var match = rDecLiteral.exec(rest) || rHexLiteral.exec(rest); + const rest = scanner.rest(); + const match = rDecLiteral.exec(rest) || rHexLiteral.exec(rest); if (! match) { scanner.pos = startPos; return null; } - var matchText = match[0]; + const matchText = match[0]; scanner.pos += matchText.length; - var text = (isNegative ? '-' : '') + matchText; - var value = Number(matchText); + const text = (isNegative ? '-' : '') + matchText; + let value = Number(matchText); value = (isNegative ? -value : value); return { text: text, value: value }; } export function parseIdentifierName (scanner) { - var startPos = scanner.pos; - var rest = scanner.rest(); - var match = rIdentifierPrefix.exec(rest); + const startPos = scanner.pos; + let rest = scanner.rest(); + let match = rIdentifierPrefix.exec(rest); if (! match) return null; scanner.pos += match[0].length; rest = scanner.rest(); - var foundMore = true; + let foundMore = true; while (foundMore) { foundMore = false; @@ -112,7 +112,7 @@ export function parseExtendedIdentifierName (scanner) { // parse an identifier name optionally preceded by '@' if (scanner.peek() === '@') { scanner.pos++; - var afterAt = parseIdentifierName(scanner); + const afterAt = parseIdentifierName(scanner); if (afterAt) { return '@' + afterAt; } else { @@ -125,17 +125,17 @@ export function parseExtendedIdentifierName (scanner) { } export function parseStringLiteral (scanner) { - var startPos = scanner.pos; - var rest = scanner.rest(); - var match = rStringQuote.exec(rest); + const startPos = scanner.pos; + let rest = scanner.rest(); + let match = rStringQuote.exec(rest); if (! match) return null; - var quote = match[0]; + const quote = match[0]; scanner.pos++; rest = scanner.rest(); - var jsonLiteral = '"'; + let jsonLiteral = '"'; while (match) { match = rStringMiddle.exec(rest); @@ -187,7 +187,7 @@ export function parseStringLiteral (scanner) { scanner.fatal("Unterminated string literal"); jsonLiteral += '"'; - var text = scanner.input.substring(startPos, scanner.pos); - var value = JSON.parse(jsonLiteral); + const text = scanner.input.substring(startPos, scanner.pos); + const value = JSON.parse(jsonLiteral); return { text: text, value: value }; }