Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Addon-docs: Error: Evaluation failed: TypeError: Cannot convert a Symbol value to a string #11554

Closed
FabianSellmann opened this issue Jul 15, 2020 · 28 comments · Fixed by #26382

Comments

@FabianSellmann
Copy link
Contributor

FabianSellmann commented Jul 15, 2020

Describe the bug
The error Error: Evaluation failed: TypeError: Cannot convert a Symbol value to a string is thrown at runtime for a story under the cirucmenstance described below.
To Reproduce
Steps to reproduce the behavior:

  1. Have story wrapped in a React.Profiler
  2. Have docs addon enabled
  3. Open story in story book
    Expected behavior
    It should not throw this error

Using storybook v6.0-rc3

Traced it down that the error originates here: https://github.com/algolia/react-element-to-jsx-string/blob/c4908bbb52e58e104c9d42d1ceaff80d53fd4bdf/src/formatter/formatReactElementNode.js#L122

The react-element-to-jsx-string package is a dependency is a dependency of the docs addon.

While I dont have the time to build a repro case right now, I think it should be fairly easy to do with the information provided. Hope this helps. Best regards.

@shilman shilman added this to the 6.0 docs milestone Jul 15, 2020
@shilman shilman self-assigned this Jul 15, 2020
@shilman shilman modified the milestones: 6.0 docs, 6.0, 6.0.x Jul 30, 2020
@stale stale bot added the inactive label Aug 22, 2020
@shilman
Copy link
Member

shilman commented Sep 1, 2020

As a workaround you can set the docs.source.type story parameter to "code".

@stale stale bot removed the inactive label Sep 1, 2020
@shilman shilman added P3 and removed tracked labels Sep 25, 2020
@shilman shilman modified the milestones: 6.0.x, 6.1 docs Nov 2, 2020
@shilman shilman modified the milestones: 6.1 docs, 6.2 docs Nov 24, 2020
@stale
Copy link

stale bot commented Dec 25, 2020

Hi everyone! Seems like there hasn't been much going on in this issue lately. If there are still questions, comments, or bugs, please feel free to continue the discussion. Unfortunately, we don't have time to get to every issue. We are always open to contributions so please send us a pull request if you would like to help. Inactive issues will be closed after 30 days. Thanks!

@stale stale bot added the inactive label Dec 25, 2020
@shilman shilman added P0 and removed P3 labels Feb 20, 2021
@stale stale bot removed the inactive label Feb 20, 2021
@shilman
Copy link
Member

shilman commented Feb 20, 2021

NOTE: this is needed to put a <React.Suspense> wrapper for performance optimizations (h/t @sokra) -- will see if i can expedite a fix.

@protoEvangelion
Copy link

protoEvangelion commented Nov 17, 2021

@davidmenendez yes here is a babel plugin I added which works. You might have to adjust the replace functions with something that works better for your code:

const template = require('@babel/template')

/**
 * Adding this babel transformer supports the src code view with Suspense
 * Until this issue is resolved, we have to add the src code docs ourselves:
 * https://github.com/storybookjs/storybook/issues/11554
 * The approach is to grab the src code for the entire file, and then strip out unecessary things
 * like large file header helpers that storybook injects so we only show the essentials.
 */
module.exports = () => {
  return {
    visitor: {
      Program(path, state) {
        if (state.file.opts.filename.endsWith('.stories.tsx')) {
          const srcCode = path.hub.file.code
            .trim()
            .replace(
              /(.*((__(STORY|LOCATIONS_MAP)__)|(\/\/)|(\/\*)|(@storybook\/react)|(Template\.parameters =))|(Template\.storyName)).*/g,
              ''
            )
            .replace(/.*React\.Suspense.*\n/gm, '')
            .replace(/export default.*Meta/s, '')
            .replace(/\n\s*\n/g, '\n\n')

          path.node.body.push(
            template.default.ast(`
Template.parameters = {
    ...Template.parameters,
    docs: {
        source: {
            code: \`${srcCode}\`
        }
    }
};`)
          )
        }
      }
    }
  }
}

In your main.js file:

module.exports = {
  stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: ['@storybook/addon-essentials'],
  babel: async config => {
    return {
      ...config,
      plugins: [
        ...config.plugins,
        path.resolve(__dirname, './babel-docs-plugin.js')
      ]
    }
  },

Here is a working lazy loaded component:

image

@donaldpipowitch
Copy link
Contributor

I saw this error after upgrading to 6.4. It worked fine previously. I created an example repository for this. Is this actually Storybook problem or react-element-to-jsx-string or something completely else? Are we doing something wrong?

(Note: This workaround helps.)

@MarkLyck
Copy link
Contributor

I'm still running into this issue over 2 years later 😞

I wanted to add a withSuspense decorator so any storybook components I have that relies on Suspense would be able to render.

But getting the same error:

Cannot convert a Symbol value to a string

The workaround works for individual components. However it would be better if there was a "global" solution.

I'm now having to go through all of our stories to:

  • import { Suspense } from 'react'
  • wrap the component in the story with `...
  • Define and override parameters for that story:
story.parameters = {
  docs: {
    source: {
      code: 'Disabled for this story, see https://github.com/storybookjs/storybook/issues/11554',
    },
  },
}

x100 for all our of storybook components that rely on Suspense after upgrading.

Does anyone know of a way to solve this problem at the storybook level instead of individual stories? in preview or main files?

@zhyd1997
Copy link
Contributor

Submitted a PR here: #19004

@shilman shilman removed the P0 label Oct 18, 2022
@shilman
Copy link
Member

shilman commented Oct 28, 2022

Yo-ho-ho!! I just released https://github.com/storybookjs/storybook/releases/tag/v7.0.0-alpha.46 containing PR #19004 that references this issue. Upgrade today to the @next NPM tag to try it out!

npx sb upgrade --prerelease

Closing this issue. Please re-open if you think there's still more to do.

@shilman shilman closed this as completed Oct 28, 2022
@sirganya
Copy link

sirganya commented Nov 8, 2022

This issue still exists using 7.0.0-alpha.48

decorators: [(Story) => <Suspense>{Story()}</Suspense>]

gives the error

Cannot convert a Symbol value to a string

@zhyd1997
Copy link
Contributor

zhyd1997 commented Nov 8, 2022

@zhyd1997
Copy link
Contributor

zhyd1997 commented Nov 9, 2022

Handled by PR #19785

@triglian
Copy link

triglian commented Mar 9, 2023

Hello, the PR #19785 has not been merged and this is still an issue. Using i18next in a global decorator is a common use case where the current issue occurs. Any plans to fix this?

@shulcsm
Copy link

shulcsm commented Mar 9, 2023

Issue persists in 7.0.0-beta.64

@fizz3r
Copy link

fizz3r commented Apr 5, 2023

#19785

@zhyd1997 and @shilman , any update on this PR as the issue is still remaining as mentioned above.

@KorySchneider
Copy link
Contributor

KorySchneider commented Jun 7, 2023

I am seeing this error using Storybook 7.0.18 7.0.20 with Vite and React. Haven't been able to pin down what exactly what is causing the problem. Using the docs workaround until this gets fixed.

@shilman Can we re-open this issue? I see the PR mentioned above is still open.

@jclarkcisco
Copy link

I am also seeing this issue in SB7 + React.

@alexgorbatchev
Copy link

Here's another workaround

const ReactSuspense = ({ children }: { children: React.ReactNode }) => <React.Suspense>{children}</React.Suspense>;

export function withSuspense<TFramework extends AnyFramework = AnyFramework, TArgs = Args>(
  story: PartialStoryFn<TFramework, TArgs>,
  ctx: StoryContext<TFramework, TArgs>,
) {
  return (
    <ReactSuspense>
      <>{story(ctx)}</>
    </ReactSuspense>
  );
}

@RowinVanAmsterdam
Copy link

I noticed this issue is happening only when there are arguments in a story. For example, this will throw the error Cannot convert a Symbol value to a string:

    render: (args) => {
        const iconName =  args.icon;
        const Icon = useMemo(() => lazy(() => import(`../../../foundation/Icons/tsx/${iconName}`).then((module) => ({ default: module[iconName] }))), [iconName]);

But without "args", it work flawlessly:

    render: () => {
        const iconName =  "Homeline";
        const Icon = useMemo(() => lazy(() => import(`../../../foundation/Icons/tsx/${iconName}`).then((module) => ({ default: module[iconName] }))), [iconName]);

@jaens
Copy link

jaens commented Feb 16, 2024

This is still an issue in 7.6.16.

Using a <Suspense> or anything related inside a render functions seems to trigger it, which is pretty bad, considering this is fairly common.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.