From bbbd05cab7260f7db9ffcb4adb2e19bdf661bca9 Mon Sep 17 00:00:00 2001 From: Johannes Ewald Date: Tue, 28 Apr 2015 00:46:50 +0200 Subject: [PATCH] Fix issue where the strict mode was not detected when a comment was before "strict mode"; Fixes #54 --- lib/detectStrictMode.js | 20 ++++++++++++++++++-- test/detectStrictMode.test.js | 12 +++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/detectStrictMode.js b/lib/detectStrictMode.js index 35f27fb..57dc14d 100644 --- a/lib/detectStrictMode.js +++ b/lib/detectStrictMode.js @@ -1,3 +1,7 @@ +var multiLineComment = /^\s*\/\*.*?\*\//; +var singleLineComment = /^\s*\/\/.*?[\r\n]/; +var strictMode = /^\s*(?:"use strict"|'use strict')[ \t]*(?:[\r\n]|;)/; + /** * Returns true if the source code is intended to run in strict mode. Does not detect * "use strict" if it occurs in a nested function. @@ -6,7 +10,19 @@ * @return {Boolean} */ function detectStrictMode(src) { - return (/^\s*(?:"use strict"|'use strict')[ \t]*(?:[\r\n]|;)/g).test(src); + var singleLine; + var multiLine; + + while ((singleLine = singleLineComment.test(src)) || (multiLine = multiLineComment.test(src))) { + if (singleLine) { + src = src.replace(singleLineComment, ""); + } + if (multiLine) { + src = src.replace(multiLineComment, ""); + } + } + + return strictMode.test(src); } -module.exports = detectStrictMode; \ No newline at end of file +module.exports = detectStrictMode; diff --git a/test/detectStrictMode.test.js b/test/detectStrictMode.test.js index 5cde34e..06eb1c4 100644 --- a/test/detectStrictMode.test.js +++ b/test/detectStrictMode.test.js @@ -2,6 +2,7 @@ var expect = require("expect.js"), detectStrictMode = require("../lib/detectStrictMode.js"); describe("detectStrictMode", function () { + it("should detect all valid uses of \"use strict\";", function () { expect(detectStrictMode('"use strict";')).to.be(true); expect(detectStrictMode("'use strict';")).to.be(true); @@ -11,13 +12,22 @@ describe("detectStrictMode", function () { expect(detectStrictMode('"use strict"\r\n')).to.be(true); expect(detectStrictMode('"use strict" ; test();')).to.be(true); }); + + it("should be allowed to place comments before \"use strict\";", function () { + expect(detectStrictMode('// some comment\n"use strict";')).to.be(true); + expect(detectStrictMode('/* yo! */"use strict"; /* another comment */')).to.be(true); + expect(detectStrictMode(' // yes yo\r\n\r\n\r\n /*oh yoh*/\r\n//oh snap!\r /* yoh! */"use strict";')).to.be(true); + }); + it("should not detect invalid uses of \"use strict\";", function () { expect(detectStrictMode('" use strict ";')).to.be(false); expect(detectStrictMode('"use strict".replace("use", "fail");')).to.be(false); expect(detectStrictMode('"use strict" .replace("use", "fail");')).to.be(false); expect(detectStrictMode(';"use strict";')).to.be(false); }); + it("should not detect \"use strict\"; if it occurs in some nested function", function () { expect(detectStrictMode('function () {"use strict";}')).to.be(false); }); -}); \ No newline at end of file + +});