Skip to content

Commit

Permalink
Reexports styled-jsx JSXStyle in nextjs (#36585)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
huozhi and timneutkens committed Apr 30, 2022
1 parent 948128a commit 7a09f88
Show file tree
Hide file tree
Showing 57 changed files with 101 additions and 57 deletions.
@@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-swc/crates/styled_jsx/src/utils.rs
Expand Up @@ -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,
},
}))
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default {
styles: <_JSXStyle id={"71f03d42ea0ec6"}>{".container.jsx-71f03d42ea0ec6{background:#000;color:white;font-weight:700;height:100px}"}</_JSXStyle>,
className: "jsx-71f03d42ea0ec6"
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div >

<style jsx>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=>{
const Element = 'div';
return <div className={"jsx-abb4c2202db1a207"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import styles from './styles';
const styles2 = require('./styles2');
// external only
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={"jsx-b2b86d63f35d25ee"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={"jsx-1952086b0a5ae64c"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const Test = ()=><div className={"jsx-a9535d7d5f32c3c4"}>

<span className={"jsx-a9535d7d5f32c3c4"}>test</span>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
function NavigationItem({ active , className , }) {
return <span className={"jsx-2342aae4628612c6" + " " + (cn({
active
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (({ children })=><div className={`jsx-${styles.__hash}`}>

<p className={`jsx-${styles.__hash}`}>{children}</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const color = 'red';
const otherColor = 'green';
const A = ()=><div className={"jsx-498d4e86e548e679"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
const Element = 'div';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import styles from './styles2';
export default (({ level =1 })=>{
const Element = `h${level}`;
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (({ level =1 })=>{
const Element = `h${level}`;
return <Element className={"jsx-fca64cc3f069b519" + " " + "root"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const darken = (c)=>c
;
const color = 'red';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
function test() {
({
styles: <_JSXStyle id={"abb4c2202db1a207"}>{"div.jsx-abb4c2202db1a207{color:red}"}</_JSXStyle>,
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import styles, { foo as styles3 } from './styles';
const styles2 = require('./styles2');
export default (()=><div >
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import styles from './styles';
export default (()=><div className={`jsx-${styles.__hash}`}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import styles from './styles';
const styles2 = require('./styles2');
import { foo as styles3 } from './styles';
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import React from 'react';
export default (()=><>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const Test = ()=><div className={"jsx-5a206f122d1cb32e"}>

<span className={"jsx-5a206f122d1cb32e"}>test</span>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default function IndexPage() {
return <div className={"jsx-b6abd0684ba81871"}>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const Test = ()=><div className={"jsx-d47d6adadf14e957"}>

<_JSXStyle id={"d47d6adadf14e957"}>{"body{color:red}:hover{color:red;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-animation:foo 1s ease-out;-moz-animation:foo 1s ease-out;-o-animation:foo 1s ease-out;animation:foo 1s ease-out}div a{display:none}[data-test]>div{color:red}"}</_JSXStyle>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (({ breakPoint })=><div className={_JSXStyle.dynamic([
[
"1568e0a11702cf40",
Expand Down
Expand Up @@ -2,7 +2,7 @@ export default function IndexPage() {
return (
<div>
<h1>Hello World.</h1>

<style jsx global>{`
@supports (display: flex) {
h1 {
Expand Down
@@ -1,10 +1,10 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default function IndexPage() {
return <div className={"jsx-bbdada4ef17d18ef"}>

<h1 className={"jsx-bbdada4ef17d18ef"}>Hello World.</h1>



<_JSXStyle id={"bbdada4ef17d18ef"}>{"@supports(display:flex){h1{color:hotpink}}"}</_JSXStyle>

Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const Test = ()=><_JSXStyle id={"94239b6d6b42c9b5"}>{"p{color:red}"}</_JSXStyle>
;
export default (()=><div className={"jsx-3822e6e1fb9fa41a"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
const attrs = {
id: 'test'
};
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>woot</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import Link from "next/link";
export default function IndexPage() {
return <div className={"jsx-2339e3d61ab4470c"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-c7c3a8e231c9215a"}>

<p className={"jsx-c7c3a8e231c9215a"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
import colors, { size } from './constants';
const color = 'red';
const bar = new String("div.jsx-aaed0341accea8f{font-size:3em}");
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export const Red = ({ Component ='button' , })=>{
return <Component className={_JSXStyle.dynamic([
[
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={"jsx-1f6cef12199c3a8f"}>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default function Home({ fontFamily }) {
return <div className={_JSXStyle.dynamic([
[
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default class {
render() {
return <div className={_JSXStyle.dynamic([
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-53fd644ab080300c"}>

<p className={"jsx-53fd644ab080300c"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-1f7963ae04c6466a"}>

<p className={"jsx-1f7963ae04c6466a"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-1a19bb4817c105dd"}>

<p className={"jsx-1a19bb4817c105dd"}>test</p>
Expand Down
@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-938ca197692ef624"}>

<p className={"jsx-938ca197692ef624"}>test</p>
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -1,4 +1,4 @@
import _JSXStyle from "styled-jsx/style";
import _JSXStyle from "next/dist/shared/lib/styled-jsx";
export default (()=><div className={"jsx-94239b6d6b42c9b5"}>

<p className={"jsx-94239b6d6b42c9b5"}>test</p>
Expand Down
6 changes: 3 additions & 3 deletions packages/next/build/babel/preset.ts
Expand Up @@ -8,15 +8,15 @@ type StyledJsxPlugin = [string, any] | string
type StyledJsxBabelOptions =
| {
plugins?: StyledJsxPlugin[]
styleModule?: string
'babel-test'?: boolean
}
| undefined

// Resolve styled-jsx plugins
function styledJsxOptions(options: StyledJsxBabelOptions) {
if (!options) {
return {}
}
options = options || {}
options.styleModule = 'next/dist/shared/lib/styled-jsx'

if (!Array.isArray(options.plugins)) {
return options
Expand Down
1 change: 1 addition & 0 deletions packages/next/shared/lib/styled-jsx.d.ts
@@ -0,0 +1 @@
export default function JSXStyle(props: any): null
1 change: 1 addition & 0 deletions packages/next/shared/lib/styled-jsx.js
@@ -0,0 +1 @@
module.exports = require('styled-jsx/style')
42 changes: 42 additions & 0 deletions test/e2e/styled-jsx/index.test.ts
@@ -0,0 +1,42 @@
import { createNext } from 'e2e-utils'
import { NextInstance } from 'test/lib/next-modes/base'
import { renderViaHTTP } from 'next-test-utils'
import cheerio from 'cheerio'

function runTest(packageManager?: string) {
describe(`styled-jsx${packageManager ? ' ' + packageManager : ''}`, () => {
let next: NextInstance

beforeAll(async () => {
next = await createNext({
files: {
'pages/index.js': `
export default function Page() {
return (
<div>
<style jsx>{'p { color: red; }'}</style>
<p>hello world</p>
</div>
)
}
`,
},
...(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')

0 comments on commit 7a09f88

Please sign in to comment.