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

[Bug]: 7.0.18 and newer broke custom non-prop args with Vue3 and Typescript #23352

Closed
johanvanhelden opened this issue Jul 7, 2023 · 13 comments

Comments

@johanvanhelden
Copy link

johanvanhelden commented Jul 7, 2023

Describe the bug

In Storybook 7.0.17 and below I had the following list of args:

args: {
        withError: true,
        withHelpText: true,
        value: ['user'],
        
        label: 'Check group label',
        helpText: 'I am a helpful text that gives clear insight in what to do with this input.',
        disabled: false,
        autofocus: false,
        colSpan: '2/4',

        options: [
            { value: 'admin', label: 'Admin' },
            { value: 'user', label: 'User' },
            { value: '-', label: '-' },
        ],
    },

Where withError, withHelpText and value are custom controls. They are not props on the component in the story but used to make some reactive functionality work in the story itself. This worked great.

After updating to 7.0.18 or newer (tried the latest v8.0.5) they stopped working and the story completely broke.

I assume it's either because of this: #22814 or this #22717 but that's just a guess.

I get the following typescript error:

Type '<snip>' is not assignable to type 'Partial<ComponentPropsAndSlots<DefineComponent<snip>>>'.
  Object literal may only specify known properties, and 'withError' does not exist in type 'Partial<ComponentPropsAndSlots<DefineComponent<snip>>>'.

To Reproduce

Here is a fresh new reproduction environment with Storybook 8.0:
https://stackblitz.com/edit/github-vrknd1-cwcnes?file=package.json

See that the story is now broken and the withFooter is not functional and the footer is also not visible.

If you want to see it working, here is a reproduction environment running Storybook 7.0.17 where it worked:
https://stackblitz.com/edit/github-vrknd1-jpfa6f?file=package.json

The repro files can also be found here: https://gist.github.com/johanvanhelden/59abcf104c03d07e08d34eb11fd51511

System

Storybook Environment Info:

  System:
    OS: Linux 5.15 Ubuntu 22.04.3 LTS 22.04.3 LTS (Jammy Jellyfish)
    CPU: (20) x64 12th Gen Intel(R) Core(TM) i7-12700H
    Shell: 5.8.1 - /usr/bin/zsh
  Binaries:
    Node: 18.19.0 - ~/.nvm/versions/node/v18.19.0/bin/node
    npm: 10.2.3 - ~/.nvm/versions/node/v18.19.0/bin/npm <----- active
  Browsers:
    Chrome: 118.0.5993.70
  npmPackages:
    @storybook/addon-essentials: ^8.0.5 => 8.0.5
    @storybook/addon-interactions: ^8.0.5 => 8.0.5
    @storybook/addon-links: ^8.0.5 => 8.0.5
    @storybook/manager-api: ^8.0.5 => 8.0.5
    @storybook/testing-library: ^0.2.2 => 0.2.2
    @storybook/theming: ^8.0.5 => 8.0.5
    @storybook/vue3: ^8.0.5 => 8.0.5
    @storybook/vue3-vite: ^8.0.5 => 8.0.5
    storybook: ^8.0.5 => 8.0.5

Additional context

No response

@johanvanhelden johanvanhelden changed the title [Bug]: 7.0.18 broke custom non-prop args with Vue3 and Typescript [Bug]: 7.0.18 and newer broke custom non-prop args with Vue3 and Typescript Jul 7, 2023
@ChazUK
Copy link

ChazUK commented Jul 13, 2023

I am also seeing a similar issue when using Angular when trying to add an additional custom control.

The error:

Type '{ label: { control: string; value: string; }; }' is not assignable to type 'Partial<ArgTypes<BunkButtonComponent>>'.
  Object literal may only specify known properties, and 'label' does not exist in type 'Partial<ArgTypes<BunkButtonComponent>>'.ts(2322)
index.d.ts(1153, 5): The expected type comes from property 'argTypes' which is declared here on type 'Meta<BunkButtonComponent>'

Story with custom control

import { Meta, StoryObj } from '@storybook/angular';

import { BunkButtonComponent } from './button.component';

const meta: Meta<BunkButtonComponent> = {
  title: 'Components/Button',
  component: BunkButtonComponent,
  parameters: {
    docs: false,
  },
  argTypes: {
    label: {
      control: 'string',
      value: 'Button',
    },
  },
};

export default meta;
type Story = StoryObj<BunkButtonComponent>;

const Template: Story = {
  render: (args) => {
    const { label, ...props } = args;
    return {
      props,
      template: `
      <bunk-button>
        ${label}
      </bunk-button>
    `,
    };
  },
};

export const Default: Story = {
  ...Template,
  args: {
    disabled: false,
    type: 'button',
    color: 'primary',
  },
};

Environment info:

  System:
    OS: macOS 13.4.1
    CPU: (16) x64 Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
  Binaries:
    Node: 16.18.1 - ~/.nvm/versions/node/v16.18.1/bin/node
    Yarn: 1.22.19
    npm: 8.19.2 - ~/.nvm/versions/node/v16.18.1/bin/npm
  Browsers:
    Chrome: 114.0.5735.198
    Edge: 114.0.1823.55
    Safari: 16.5.1
  npmPackages:
    @storybook/addon-essentials: ^7.0.26 => 7.0.26 
    @storybook/addon-interactions: ^7.0.26 => 7.0.26 
    @storybook/addon-links: ^7.0.26 => 7.0.26 
    @storybook/angular: ^7.0.26 => 7.0.26 
    @storybook/blocks: ^7.0.26 => 7.0.26 
    @storybook/cli: ^7.0.26 => 7.0.26 
    @storybook/testing-library: ^0.2.0 => 0.2.0

@supuwoerc
Copy link

+1

@valentinpalkovic
Copy link
Contributor

Pinging @kasperpeulen here because the mentioned PRs are from you. Maybe you have an idea of what's going on.

@vanessayuenn
Copy link
Contributor

@kasperpeulen @chakAs3 any idea what's going on here?

@chakAs3
Copy link
Contributor

chakAs3 commented Jan 17, 2024

hi @vanessayuenn this is an old issue i don't what is wrong or if it is on the new releases. need a repro to look at it

@johanvanhelden
Copy link
Author

hi @vanessayuenn this is an old issue i don't what is wrong or if it is on the new releases. need a repro to look at it

In my main post is a repro sandbox

@chakAs3
Copy link
Contributor

chakAs3 commented Jan 17, 2024

@johanvanhelden ok i will check it out and get back to you if i have some question

@K3TH3R
Copy link

K3TH3R commented Mar 15, 2024

I'm seeing this currently on Storybook 8.0.0 with my Vue/Vite repo as well. I'm trying to add argTypes/args for the actions/interactions features. The onClicked implementations work as expected in the actions/interactions panels though.
Screenshot 2024-03-15 at 6 04 08 pm

@kasperpeulen
Copy link
Contributor

@K3TH3R Could you provide a reproduction with https://storybook.new/

We actually have a test for this scenario:

it('Events are inferred from component', () => {
const meta: Meta<typeof Button> = {
component: Button,
args: {
label: 'good',
disabled: false,
onMyChangeEvent: (value) => {
expectTypeOf(value).toEqualTypeOf<number>();
},
},
render: (args) => {
return h(Button, {
...args,
onMyChangeEvent: (value) => {
expectTypeOf(value).toEqualTypeOf<number>();
},
});
},
};
expectTypeOf(meta).toMatchTypeOf<Meta<typeof Button>>();
});

@johanvanhelden
Copy link
Author

johanvanhelden commented Mar 28, 2024

@kasperpeulen @chakAs3 @vanessayuenn

I can confirm it is still broken in Storybook 8.0.

Here is a fresh new reproduction environment with Storybook 8.0:
https://stackblitz.com/edit/github-vrknd1-cwcnes?file=package.json

If you want to see it working, here is a reproduction environment running Storybook 7.0.17 where it worked:
https://stackblitz.com/edit/github-vrknd1-jpfa6f?file=package.json

@kasperpeulen
Copy link
Contributor

@johanvanhelden This is probably related to this PR:
#22229

Which rolled back an unexpected breaking change in 7.0.

The correct way to write this in 7 and 8 is:

const meta = {
  component: Component,
  render: (args) => ({
    components: { Component },
    data: () => ({ args }),
    template: `
      <Component v-bind="args">
          Card content
          <template #footer v-if="args.withFooter">
              Footer for the card
          </template>
      </Component>
        `,
  }),
  args: {
    withFooter: false,
  },
};

Copy link
Contributor

Hi there! Thank you for opening this issue, but it has been marked as stale because we need more information to move forward. Could you please provide us with the requested reproduction or additional information that could help us better understand the problem? We'd love to resolve this issue, but we can't do it without your help!

@github-actions github-actions bot added the Stale label Apr 19, 2024
@johanvanhelden
Copy link
Author

const meta = {
  component: Component,
  render: (args) => ({
    components: { Component },
    data: () => ({ args }),
    template: `
      <Component v-bind="args">
          Card content
          <template #footer v-if="args.withFooter">
              Footer for the card
          </template>
      </Component>
        `,
  }),
  args: {
    withFooter: false,
  },
};

Thank you! I've tried this method and it works flawlessly.

@github-project-automation github-project-automation bot moved this from Empathy Backlog to Done in Core Team Projects Apr 23, 2024
sentientforest added a commit to sentientforest/galachain-sdk that referenced this issue Sep 23, 2024
This is a work-in-progress commit. It all started
with simply wanting to build our typedoc generated
documentation for modules such as chain-api, chaincode,
etc.

The short summary is that chain-ui is a UI package, designed
to contain multiple front-end libraries/packages.
It looks like web component and vue versions to start.

And the rest of the mono-repo is GalaChain / Hyperledger Fabric
based modules that use Node 18 vs 20, and are fully backend.

I may or may not
return to this in the future. But I'm publishing this
just in case it's useful to anyone else who embarks on
this build. Maybe a developer that was involved in the
initial chain-ui build. Or maybe we will collectively
decide to rework our monorepo structure and separate
concerns between UI and backend / blockchain / Hyperledger
Fabric libraries.

These notes are for my future self or others.
I was fully unfamiliar with
Vue, Vite, tailwind,  etc. etc. and the original development
context of this entire chain-ui segment of our monorepo
prior to attempting to get all
this to build together. And I haven't done any front end
work since sometime prior to November 1, 2021.

It feels like I made it almost all the way through
troubleshooting the monorepo
build of galachain/sdk, post-chain-ui merge.
However, solving each hurdle seemed to lead to another
and eventually I had to move on to other engagements.

Rough notes follow

Some errors in progress of working through:

$ npm run typedoc-chain-api

```
> @gala-chain/sdk@1.4.2 typedoc-chain-api
> typedoc --tsconfig ./tsconfig.base.json --hideGenerator --plugin typedoc-plugin-markdown --githubPages false --out ./docs/chain-api-docs ./chain-api/src && rm ./docs/chain-api-docs/README.md

[info] Loaded plugin typedoc-plugin-markdown
chain-ui/src/components/MintToken.stories.ts:18:23 - error TS2307: Cannot find module './MintToken.vue' or its corresponding type declarations.

18 import MintToken from './MintToken.vue'
                         ~~~~~~~~~~~~~~~~~

chain-ui/src/components/MintTokenWithAllowance.stories.ts:18:36 - error TS2307: Cannot find module './MintTokenWithAllowance.vue' or its corresponding type declarations.

18 import MintTokenWithAllowance from './MintTokenWithAllowance.vue'
```

Many, many more errors like the above follow - lots of TypeScript compilation
problems. Possibly in part due to the root of the mono-repo using a
different tsconfig than the genesis of this chain-ui package, I'll warrant.

```
Rollup failed to resolve import "primevue/inputText" If you do want to externalize this module explicitly add it to`build.rollupOptions.external`
```

```
npm i --install-strategy=nested tailwindcss-primeui
```

This link looks similar to what we have -
https://storybook.js.org/docs/writing-stories/typescript

```
type Story = StoryObj<typeof Button>;
```

storybookjs/storybook#23352

It appears maybe
7.0.18 broke non-prop custom args Vue3 + TypeScript

storybookjs/storybook#22229

And maybe this rolled back some breaking changes

seems we're using CSF 2, version 3 migration guide is available and is also discussed
in improved ts features blog post

https://storybook.js.org/docs/api/csf?ref=storybookblog.ghost.io#upgrading-from-csf-2-to-csf-3
https://storybook.js.org/blog/storybook-csf3-is-here/?ref=storybookblog.ghost.io
https://storybook.js.org/blog/improved-type-safety-in-storybook-7/

```
executed in chain-ui folder
$ npm install --install-strategy=nested primevue
```

```
$ grep primevue package-lock.json
        "primevue": "^3.53.0",
    "chain-ui/node_modules/primevue": {
      "resolved": "https://registry.npmjs.org/primevue/-/primevue-3.53.0.tgz",
 ```

ran in root dir, doesn't solve

```
npm install -w chain-ui --install-strategy=nested primevue
cd chain-ui
npm install --install-strategy=nested primevue
```

troubleshooting

```
delete primevue from chain-ui/package.json
cd ..
npm install
cd chain-ui
npm install --save --install-strategy=nested primevue
```

https://docs.npmjs.com/cli/v10/using-npm/workspaces
https://docs.npmjs.com/cli/v10/using-npm/workspaces#defining-workspaces
https://docs.npmjs.com/downloading-and-installing-packages-locally
https://docs.npmjs.com/cli/v10/commands/npm-install#install-strategy
https://docs.npmjs.com/cli/v10/commands/npm-install#configuration
https://docs.npmjs.com/cli/v10/configuring-npm/npmrc
https://docs.npmjs.com/cli/v10/configuring-npm/package-json?v=true#bundledependencies
https://nx.dev/concepts/decisions/why-monorepos
https://nx.dev/nx-api/storybook
https://nx.dev/nx-api/storybook
https://nodejs.org/api/packages.html#conditional-exports
https://v3.primevue.org/theming/
https://v3.primevue.org/vite
https://stackoverflow.com/questions/61467722/difference-between-npm-update-and-remove-package-lock-json-plus-npm-install
https://stackoverflow.com/questions/77755121/vue-tsc-failing-with-error-referenced-project-may-not-disable-emit-on-vue-proj
https://stackoverflow.com/questions/76935759/how-to-get-vite-ts-and-vue-to-properly-work-in-vs-code
https://www.geeksforgeeks.org/how-to-override-nested-npm-dependency-versions/
https://blog.logrocket.com/comparing-vue-3-options-api-composition-api/
https://stackoverflow.com/questions/71055016/vue-3-defineprops-with-types-and-componentobjectpropsoptions-like-default-or-va
https://stackoverflow.com/questions/66288645/vite-does-not-build-tailwind-based-on-config
https://vitejs.dev/guide/features.html#postcss
https://stackoverflow.com/questions/66288645/vite-does-not-build-tailwind-based-on-config/78451703#78451703
https://tailwindcss.com/docs/content-configuration
https://vitejs.dev/config/build-options#build-target
https://rollupjs.org/configuration-options/
https://rollupjs.org/configuration-options/#output-hoisttransitiveimports
https://rollupjs.org/configuration-options/#context
https://nx.dev/recipes/vite/configure-vite
https://nx.dev/nx-api/vite
https://nx.dev/nx-api/vite/generators/configuration
https://stackoverflow.com/questions/70807080/how-to-change-the-ts-path-aliases-for-an-nx-application
https://tailwindcss.com/docs/guides/vite#vue
https://v2.tailwindcss.com/docs/guides/vue-3-vite
https://tailwindcss.com/docs/customizing-colors
https://primevue.org/tailwind/

Omitted various links to github issues in related dependencies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Archived in project
Development

No branches or pull requests

8 participants