From dd8d59b9835ef398ade5bf722817ba006ebd060c Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 20 Jun 2025 04:11:49 +0800 Subject: [PATCH] Fix `isTypeModuleObjectExpression` (#17599) --- src/language-js/print/call-arguments.js | 24 ++- .../__snapshots__/format.test.js.snap | 90 +----------- tests/format/js/module-blocks/format.test.js | 18 +-- .../__snapshots__/format.test.js.snap | 137 ++++++++++++++++++ .../module-blocks/quote-props/format.test.js | 9 ++ .../js/module-blocks/quote-props/worker.js | 36 +++++ tests/format/js/module-blocks/worker.js | 15 -- 7 files changed, 208 insertions(+), 121 deletions(-) create mode 100644 tests/format/js/module-blocks/quote-props/__snapshots__/format.test.js.snap create mode 100644 tests/format/js/module-blocks/quote-props/format.test.js create mode 100644 tests/format/js/module-blocks/quote-props/worker.js delete mode 100644 tests/format/js/module-blocks/worker.js diff --git a/src/language-js/print/call-arguments.js b/src/language-js/print/call-arguments.js index c7cbaea59..f958d4698 100644 --- a/src/language-js/print/call-arguments.js +++ b/src/language-js/print/call-arguments.js @@ -378,16 +378,24 @@ function isNonEmptyBlockStatement(node) { ); } -// { type: "module" } +// `{ type: "module" }` and `{"type": "module"}` function isTypeModuleObjectExpression(node) { + if (!(node.type === "ObjectExpression" && node.properties.length === 1)) { + return false; + } + + const [property] = node.properties; + + if (!isObjectProperty(property)) { + return false; + } + return ( - node.type === "ObjectExpression" && - node.properties.length === 1 && - isObjectProperty(node.properties[0]) && - node.properties[0].key.type === "Identifier" && - node.properties[0].key.name === "type" && - isStringLiteral(node.properties[0].value) && - node.properties[0].value.value === "module" + !property.computed && + ((property.key.type === "Identifier" && property.key.name === "type") || + (isStringLiteral(property.key) && property.key.value === "type")) && + isStringLiteral(property.value) && + property.value.value === "module" ); } diff --git a/tests/format/js/module-blocks/__snapshots__/format.test.js.snap b/tests/format/js/module-blocks/__snapshots__/format.test.js.snap index 5b5963e50..034ae7ac9 100644 --- a/tests/format/js/module-blocks/__snapshots__/format.test.js.snap +++ b/tests/format/js/module-blocks/__snapshots__/format.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`comments.js [acorn] format 1`] = ` "Unexpected token (1:32) @@ -295,91 +295,3 @@ foo(module { ================================================================================ `; - -exports[`worker.js [acorn] format 1`] = ` -"Unexpected token (1:32) -> 1 | let worker = new Worker(module { - | ^ - 2 | onmessage = function({data}) { - 3 | let mod = import(data); - 4 | postMessage(mod.fn()); -Cause: Unexpected token (1:31)" -`; - -exports[`worker.js [espree] format 1`] = ` -"Unexpected token { (1:32) -> 1 | let worker = new Worker(module { - | ^ - 2 | onmessage = function({data}) { - 3 | let mod = import(data); - 4 | postMessage(mod.fn()); -Cause: Unexpected token {" -`; - -exports[`worker.js [meriyah] format 1`] = ` -"Expected ')' (1:32) -> 1 | let worker = new Worker(module { - | ^ - 2 | onmessage = function({data}) { - 3 | let mod = import(data); - 4 | postMessage(mod.fn()); -Cause: [1:31-1:32]: Expected ')'" -`; - -exports[`worker.js [oxc] format 1`] = ` -"Expected \`,\` but found \`{\` (1:32) -> 1 | let worker = new Worker(module { - | ^ - 2 | onmessage = function({data}) { - 3 | let mod = import(data); - 4 | postMessage(mod.fn());" -`; - -exports[`worker.js format 1`] = ` -====================================options===================================== -parsers: ["babel"] -printWidth: 80 - | printWidth -=====================================input====================================== -let worker = new Worker(module { - onmessage = function({data}) { - let mod = import(data); - postMessage(mod.fn()); - } -}, {type: "module"}); - -let worker = new Worker(module { - onmessage = function({data}) { - let mod = import(data); - postMessage(mod.fn()); - } -}, {type: "module", foo: "bar" }); - -worker.postMessage(module { export function fn() { return "hello!" } }); - -=====================================output===================================== -let worker = new Worker(module { - onmessage = function ({ data }) { - let mod = import(data); - postMessage(mod.fn()); - }; -}, { type: "module" }); - -let worker = new Worker( - module { - onmessage = function ({ data }) { - let mod = import(data); - postMessage(mod.fn()); - }; - }, - { type: "module", foo: "bar" }, -); - -worker.postMessage(module { - export function fn() { - return "hello!"; - } -}); - -================================================================================ -`; diff --git a/tests/format/js/module-blocks/format.test.js b/tests/format/js/module-blocks/format.test.js index 955083ef9..25579dd12 100644 --- a/tests/format/js/module-blocks/format.test.js +++ b/tests/format/js/module-blocks/format.test.js @@ -1,9 +1,9 @@ -runFormatTest(import.meta, ["babel"], { - errors: { - acorn: ["module-blocks.js", "range.js", "comments.js", "worker.js"], - espree: ["module-blocks.js", "range.js", "comments.js", "worker.js"], - meriyah: ["module-blocks.js", "range.js", "comments.js", "worker.js"], - oxc: ["module-blocks.js", "range.js", "comments.js", "worker.js"], - "oxc-ts": ["module-blocks.js", "range.js", "comments.js", "worker.js"], - }, -}); +const errors = { + acorn: ["module-blocks.js", "range.js", "comments.js"], + espree: ["module-blocks.js", "range.js", "comments.js"], + meriyah: ["module-blocks.js", "range.js", "comments.js"], + oxc: ["module-blocks.js", "range.js", "comments.js"], + "oxc-ts": ["module-blocks.js", "range.js", "comments.js"], +}; + +runFormatTest(import.meta, ["babel"], { errors }); diff --git a/tests/format/js/module-blocks/quote-props/__snapshots__/format.test.js.snap b/tests/format/js/module-blocks/quote-props/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..efd2f8fc2 --- /dev/null +++ b/tests/format/js/module-blocks/quote-props/__snapshots__/format.test.js.snap @@ -0,0 +1,137 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`worker.js [acorn] format 1`] = ` +"Unexpected token (1:28) +> 1 | worker = new Worker(module { + | ^ + 2 | onmessage = function({data}) { + 3 | let mod = import(data); + 4 | postMessage(mod.fn()); +Cause: Unexpected token (1:27)" +`; + +exports[`worker.js [espree] format 1`] = ` +"Unexpected token { (1:28) +> 1 | worker = new Worker(module { + | ^ + 2 | onmessage = function({data}) { + 3 | let mod = import(data); + 4 | postMessage(mod.fn()); +Cause: Unexpected token {" +`; + +exports[`worker.js [meriyah] format 1`] = ` +"Expected ')' (1:28) +> 1 | worker = new Worker(module { + | ^ + 2 | onmessage = function({data}) { + 3 | let mod = import(data); + 4 | postMessage(mod.fn()); +Cause: [1:27-1:28]: Expected ')'" +`; + +exports[`worker.js [oxc] format 1`] = ` +"Expected \`,\` but found \`{\` (1:28) +> 1 | worker = new Worker(module { + | ^ + 2 | onmessage = function({data}) { + 3 | let mod = import(data); + 4 | postMessage(mod.fn());" +`; + +exports[`worker.js format 1`] = ` +====================================options===================================== +parsers: ["babel"] +printWidth: 80 + | printWidth +=====================================input====================================== +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {type: "module"}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {'type': "module"}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {type: "module", foo: "bar" }); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {...{type: "module"}}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {[type]: "module"}); + +worker.postMessage(module { export function fn() { return "hello!" } }); + +=====================================output===================================== +worker = new Worker(module { + onmessage = function ({ data }) { + let mod = import(data); + postMessage(mod.fn()); + }; +}, { type: "module" }); + +worker = new Worker(module { + onmessage = function ({ data }) { + let mod = import(data); + postMessage(mod.fn()); + }; +}, { type: "module" }); + +worker = new Worker( + module { + onmessage = function ({ data }) { + let mod = import(data); + postMessage(mod.fn()); + }; + }, + { type: "module", foo: "bar" }, +); + +worker = new Worker( + module { + onmessage = function ({ data }) { + let mod = import(data); + postMessage(mod.fn()); + }; + }, + { ...{ type: "module" } }, +); + +worker = new Worker( + module { + onmessage = function ({ data }) { + let mod = import(data); + postMessage(mod.fn()); + }; + }, + { [type]: "module" }, +); + +worker.postMessage(module { + export function fn() { + return "hello!"; + } +}); + +================================================================================ +`; diff --git a/tests/format/js/module-blocks/quote-props/format.test.js b/tests/format/js/module-blocks/quote-props/format.test.js new file mode 100644 index 000000000..67806e922 --- /dev/null +++ b/tests/format/js/module-blocks/quote-props/format.test.js @@ -0,0 +1,9 @@ +runFormatTest(import.meta, ["babel"], { + errors: { + acorn: ["worker.js"], + espree: ["worker.js"], + meriyah: ["worker.js"], + oxc: ["worker.js"], + "oxc-ts": ["worker.js"], + }, +}); diff --git a/tests/format/js/module-blocks/quote-props/worker.js b/tests/format/js/module-blocks/quote-props/worker.js new file mode 100644 index 000000000..a8247cd9d --- /dev/null +++ b/tests/format/js/module-blocks/quote-props/worker.js @@ -0,0 +1,36 @@ +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {type: "module"}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {'type': "module"}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {type: "module", foo: "bar" }); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {...{type: "module"}}); + +worker = new Worker(module { + onmessage = function({data}) { + let mod = import(data); + postMessage(mod.fn()); + } +}, {[type]: "module"}); + +worker.postMessage(module { export function fn() { return "hello!" } }); diff --git a/tests/format/js/module-blocks/worker.js b/tests/format/js/module-blocks/worker.js deleted file mode 100644 index c60963f77..000000000 --- a/tests/format/js/module-blocks/worker.js +++ /dev/null @@ -1,15 +0,0 @@ -let worker = new Worker(module { - onmessage = function({data}) { - let mod = import(data); - postMessage(mod.fn()); - } -}, {type: "module"}); - -let worker = new Worker(module { - onmessage = function({data}) { - let mod = import(data); - postMessage(mod.fn()); - } -}, {type: "module", foo: "bar" }); - -worker.postMessage(module { export function fn() { return "hello!" } });