From 38b77406ca32f205e16947ba6746e2c379536f98 Mon Sep 17 00:00:00 2001 From: Jed Fox Date: Mon, 19 Jun 2017 06:14:22 -0400 Subject: [PATCH] Fix #576 (#587) * Should fix #576 People were calling `"foo".toString() or ["foo", "bar"].toString()`, which returned the real JS string `"[object Object]"`, the stringified version of the replacements object. * Prettier code means prettier green checkmarks * Testing testing 123 * Forgot the parens around the object literal * Semicolons! * npm run format --- .../__tests__/constant-folding-test.js | 14 ++++++++++++++ .../src/index.js | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/babel-plugin-minify-constant-folding/__tests__/constant-folding-test.js b/packages/babel-plugin-minify-constant-folding/__tests__/constant-folding-test.js index ca2e633f7..352027fa6 100644 --- a/packages/babel-plugin-minify-constant-folding/__tests__/constant-folding-test.js +++ b/packages/babel-plugin-minify-constant-folding/__tests__/constant-folding-test.js @@ -237,4 +237,18 @@ describe("constant-folding-plugin", () => { ); expect(transform(source)).toBe(expected); }); + + it("shouldn’t crash on toString() calls or accesses", () => { + const source = unpad( + ` + "foo".toString(); + ["foo", "bar"].toString(); + ({}).toString(); + "foo".toString; + ["foo", "bar"].toString; + ({}).toString; + ` + ); + expect(transform(source)).toBe(source); + }); }); diff --git a/packages/babel-plugin-minify-constant-folding/src/index.js b/packages/babel-plugin-minify-constant-folding/src/index.js index 782d76be2..da5b16e70 100644 --- a/packages/babel-plugin-minify-constant-folding/src/index.js +++ b/packages/babel-plugin-minify-constant-folding/src/index.js @@ -22,7 +22,10 @@ function swap(path, member, handlers, ...args) { const key = getName(member); if (key === undefined) return; let handler = handlers[key]; - if (typeof handler !== "function") { + if ( + typeof handler !== "function" || + !Object.hasOwnProperty.call(handlers, key) + ) { if (typeof handlers[FALLBACK_HANDLER] === "function") { handler = handlers[FALLBACK_HANDLER].bind(member.object, key); } else {