Skip to content

Transpiling package using NextJS transpilePackages config causes issues with "use client" directive #82

@Syphini

Description

@Syphini

Versions

  • @prismicio/next: v1.3.4
  • next: v13.4.19
  • node: v16.17.0, v18.17.1

Reproduction

Additional Details
{
  "name": "prismic-test",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "slicemachine": "start-slicemachine"
  },
  "dependencies": {
    "@prismicio/client": "^7.2.0",
    "@prismicio/next": "^1.3.4",
    "@prismicio/react": "^2.7.1",
    "autoprefixer": "10.4.15",
    "eslint": "8.48.0",
    "eslint-config-next": "13.4.19",
    "next": "^13.4.19",
    "postcss": "8.4.29",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "tailwindcss": "3.3.3"
  }
}

Steps to reproduce

  1. Run npx create-next-app@latest and npx @slicemachine/init@latest with App Router enabled
  2. In the next.config.js file add the following to the nextConfig
const nextConfig = {
  transpilePackages: ["@prismicio/client", "@prismicio/next"]
}
  1. Create a component as follows
"use client"

import { PrismicNextLink } from "@prismicio/next"

export default function StyledLink() {
  return <PrismicNextLink />
}
  1. Import and render the new component into a page.js in your app directory
  2. Attempt to navigate to the page with component included and see a Server Component error

What is expected?

PrismicNextLink will render the same with or without the "use client" directive, as it does so when not transpiling the packages using NextJS configuration

What is actually happening?

The new component throws the following fatal error

ReactServerComponentsError:

You're importing a component that needs next/headers. That only works in a Server Component but one of its parents is marked with "use client", so it's a Client Component.
Learn more: https://nextjs.org/docs/getting-started/react-essentials

 1 | import { jsxs, Fragment, jsx } from "react/jsx-runtime";
 2 | import Script from "next/script";
 3 | import { draftMode } from "next/headers";
   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 4 | import { PrismicPreviewClient } from "./PrismicPreviewClient.js";
 5 | import { getToolbarSrc } from './_node_modules/@prismicio/client/dist/getToolbarSrc.js';
 6 | function PrismicPreview({ repositoryName, children, ...props }) {
   `----

One of these is marked as a client entry with "use client":
  ./node_modules\@prismicio\next\dist\PrismicPreview.js
  ./node_modules\@prismicio\next\dist\index.js
  ./components\StyledLink.js

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions