From 7a09f88d146665d8651c9acb2c7f4d5dc204846e Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Sat, 30 Apr 2022 22:25:05 +0200 Subject: [PATCH] Reexports styled-jsx JSXStyle in nextjs (#36585) When using pnpm / yarnPnP to install next.js, styled-jsx as dependency is not hoisted in the top level node_modules, it will fail when nodejs is trying to resolve `styled-jsx/style` from project directory. Re-export `styled-jsx/style` in next.js and let swc/babel plugin compile the import path it to `next/dist/shared/lib/styled-jsx` Resolves #10149 Closes #21320 Closes #9325 Co-authored-by: Tim Neutkens <6324199+timneutkens@users.noreply.github.com> --- .../core/tests/loader/front/attr-1/output.js | 2 +- .../next-swc/crates/styled_jsx/src/utils.rs | 2 +- .../tests/errors/no-child/output.js | 2 +- .../errors/ts-with-css-resolve/output.js | 2 +- .../tests/errors/two-children/output.js | 2 +- .../tests/errors/wrong-child-type/output.js | 2 +- .../wrong-jsx-expression-type/output.js | 2 +- .../output.js | 2 +- .../attribute-generation-modes/output.js | 2 +- .../styled_jsx/tests/fixture/class/output.js | 2 +- .../tests/fixture/comments/output.js | 2 +- .../fixture/component-attribute/output.js | 2 +- .../css-selector-after-pseudo/output.js | 2 +- .../tests/fixture/css-tag-same-file/output.js | 2 +- .../tests/fixture/different-jsx-ids/output.js | 2 +- .../fixture/dynamic-element-class/output.js | 2 +- .../dynamic-element-external/output.js | 2 +- .../tests/fixture/dynamic-element/output.js | 2 +- .../tests/fixture/expressions/output.js | 2 +- .../fixture/external-nested-scope/output.js | 2 +- .../external-stylesheet-global/output.js | 2 +- .../external-stylesheet-multi-line/output.js | 2 +- .../fixture/external-stylesheet/output.js | 2 +- .../tests/fixture/fragment/output.js | 2 +- .../fixture/global-child-selector/output.js | 2 +- .../tests/fixture/global-redundant/output.js | 2 +- .../styled_jsx/tests/fixture/global/output.js | 2 +- .../tests/fixture/issue-30480/output.js | 2 +- .../tests/fixture/issue-30570/input.js | 2 +- .../tests/fixture/issue-30570/output.js | 4 +- .../output.js | 2 +- .../fixture/mixed-global-scoped/output.js | 2 +- .../tests/fixture/multiple-jsx/output.js | 2 +- .../fixture/non-styled-jsx-style/output.js | 2 +- .../number-after-placeholder/output.js | 2 +- .../one-off-global-selectors/output.js | 2 +- .../tests/fixture/stateless/output.js | 2 +- .../styled_jsx/tests/fixture/styles/output.js | 2 +- .../tests/fixture/too-many/output.js | 2 +- .../tests/fixture/tpl-escape-1/output.js | 2 +- .../tests/fixture/tpl-escape-2/output.js | 2 +- .../tpl-placeholder-1-as-property/output.js | 2 +- .../output.js | 2 +- .../tpl-placeholder-3-as-value/output.js | 2 +- .../output.js | 2 +- .../output.js | 2 +- .../transform-css-complex-selector/output.js | 2 +- .../fixture/transform-css-global/output.js | 2 +- .../transform-css-media-query/output.js | 2 +- .../fixture/transform-css-normal/output.js | 2 +- .../fixture/transform-css-nth-1/output.js | 2 +- .../tests/fixture/transform-css/output.js | 2 +- .../tests/fixture/whitespace/output.js | 2 +- packages/next/build/babel/preset.ts | 6 +-- packages/next/shared/lib/styled-jsx.d.ts | 1 + packages/next/shared/lib/styled-jsx.js | 1 + test/e2e/styled-jsx/index.test.ts | 42 +++++++++++++++++++ 57 files changed, 101 insertions(+), 57 deletions(-) create mode 100644 packages/next/shared/lib/styled-jsx.d.ts create mode 100644 packages/next/shared/lib/styled-jsx.js create mode 100644 test/e2e/styled-jsx/index.test.ts diff --git a/packages/next-swc/crates/core/tests/loader/front/attr-1/output.js b/packages/next-swc/crates/core/tests/loader/front/attr-1/output.js index ed60ad648aa2..f82bfb4e4a00 100644 --- a/packages/next-swc/crates/core/tests/loader/front/attr-1/output.js +++ b/packages/next-swc/crates/core/tests/loader/front/attr-1/output.js @@ -1,4 +1,4 @@ -import _JSXStyle from "styled-jsx/style"; +import _JSXStyle from "next/dist/shared/lib/styled-jsx"; export default function Foo() { return /*#__PURE__*/ React.createElement("div", { render: function(v) { diff --git a/packages/next-swc/crates/styled_jsx/src/utils.rs b/packages/next-swc/crates/styled_jsx/src/utils.rs index bc720b16af38..678762e3c4fa 100644 --- a/packages/next-swc/crates/styled_jsx/src/utils.rs +++ b/packages/next-swc/crates/styled_jsx/src/utils.rs @@ -310,7 +310,7 @@ pub fn styled_jsx_import_decl(style_import_name: &str) -> ModuleItem { })], src: Str { span: DUMMY_SP, - value: "styled-jsx/style".into(), + value: "next/dist/shared/lib/styled-jsx".into(), raw: None, }, })) diff --git a/packages/next-swc/crates/styled_jsx/tests/errors/no-child/output.js b/packages/next-swc/crates/styled_jsx/tests/errors/no-child/output.js index bb0dac444e10..5ef4866a9a44 100644 --- a/packages/next-swc/crates/styled_jsx/tests/errors/no-child/output.js +++ b/packages/next-swc/crates/styled_jsx/tests/errors/no-child/output.js @@ -1,4 +1,4 @@ -import _JSXStyle from "styled-jsx/style"; +import _JSXStyle from "next/dist/shared/lib/styled-jsx"; export default (()=>
+

hello world

+
+ ) + } + `, + }, + ...(packageManager + ? { + installCommand: `npx ${packageManager} install`, + } + : {}), + }) + }) + afterAll(() => next.destroy()) + + it('should contain styled-jsx styles in html', async () => { + const html = await renderViaHTTP(next.url, '/') + const $ = cheerio.load(html) + expect($('head').text()).toContain('color:red') + }) + }) +} + +runTest() +runTest('pnpm')