t2ym / thin-hook

Thin Hook Preprocessor
Other
4 stars 1 forks source link

[safari TP 46] SyntaxError: \u can only be followed by a Unicode character sequence #188

Open t2ym opened 6 years ago

t2ym commented 6 years ago

[safari TP 46] SyntaxError: \u can only be followed by a Unicode character sequence

Reproducible Version: Release 46 (Safari 11.1, WebKit 13605.1.18.2)

Root Cause

Some Unicode escape sequences \uXXXX in literals in some modules like acorn-jsx/xhtml.js (unnecessary module) and entities/maps/*.json are converted to raw unicode characters in hook.min.js, which causes parse error in Safari TP 46.

Workaround

Use raw string literals in the source codes

diff --git a/gulpfile.js b/gulpfile.js
index 3a4ec70..bc5b888 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -159,9 +159,10 @@ gulp.task('build', () => {
       originalAst.body[0].expression.callee.body.body[0].alternate.alternate.body[4] = serviceWorkerHandlerRegistrationAst;
       // append service worker registration code
       originalAst.body[0].expression.callee.body.body[0].alternate.alternate.body[5] = serviceWorkerRegistrationAst;
+      let minifiedCode = escodegen.generate(originalAst, { format: { compact: true }, raw: true, parse: espree.parse, raw: true });
       _trimStartEndRaw(originalAst);
-      let minifiedCode = escodegen.generate(originalAst, { format: { compact: true } });
-      let minifiedAst = espree.parse(minifiedCode, espreeOptions);
+      let minifiedCode2 = escodegen.generate(originalAst, { format: { compact: true } });
+      let minifiedAst = espree.parse(minifiedCode2, espreeOptions);
       _trimStartEndRaw(minifiedAst);
       let originalAstJson = JSON.stringify(originalAst, null, 2);
       let minifiedAstJson = JSON.stringify(minifiedAst, null, 2);
@@ -235,9 +236,10 @@ gulp.task('build:coverage', () => {
       originalAst.body[0].expression.callee.body.body[0].alternate.alternate.body[4] = serviceWorkerHandlerRegistrationAst;
       // append service worker registration code
       originalAst.body[0].expression.callee.body.body[0].alternate.alternate.body[5] = serviceWorkerRegistrationAst;
+      let minifiedCode = escodegen.generate(originalAst, { format: { compact: true }, raw: true, parse: espree.parse, raw: true });
       _trimStartEndRaw(originalAst);
-      let minifiedCode = escodegen.generate(originalAst, { format: { compact: true } });
-      let minifiedAst = espree.parse(minifiedCode, espreeOptions);
+      let minifiedCode2 = escodegen.generate(originalAst, { format: { compact: true } });
+      let minifiedAst = espree.parse(minifiedCode2, espreeOptions);
       _trimStartEndRaw(minifiedAst);
       let originalAstJson = JSON.stringify(originalAst, null, 2);
       let minifiedAstJson = JSON.stringify(minifiedAst, null, 2);

Note

t2ym commented 6 years ago

Still reproducible with Safari TP Release 48 (Safari 11.2, WebKit 13606.1.2.2)