Storybook: Addon-docs: рд╕реНрд░реЛрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмреНрд▓реЙрдХ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЕрдЧре░ 2019  ┬╖  69рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: storybookjs/storybook

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рддрдХрдиреАрдХреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдЧрд╛рдЗрдб рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ, рдбреЙрдХреНрд╕ рдкреНрд░реАрд╕реЗрдЯ рдореЗрдВ sourceLoaderOptions: null рдкрд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ:

Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type

рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ tsconfig.json рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "noImplicitAny": false ред

рдкреНрд░рдЬрдирди рдХрд░рдирд╛
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо:

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдбреЙрдХреНрд╕ рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ addon-docs рд▓рд┐рдП рдПрдХ рдХрд╣рд╛рдиреА рд▓рд┐рдЦреЗрдВ
  2. рдХрд╣рд╛рдиреА рдХреА рдХрд┐рддрд╛рдм рдЪрд▓рд╛рдПрдВ

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░
рдбреЙрдХреНрд╕ рдкреГрд╖реНрда рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрд╣рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реЛрддрд╛ рд╣реИред

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдпрджрд┐ рд▓рд╛рдЧреВ рд╣реЛ, рддреЛ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдЬреЛрдбрд╝реЗрдВред

рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ
presets.js :

{
  name: '@storybook/addon-docs/react/preset',
  options: {
    sourceLoaderOptions: null,
  },
}

рдкреНрд░рдгрд╛рд▓реА:
рдкрд░реНрдпрд╛рд╡рд░рдг рдЬрд╛рдирдХрд╛рд░реА:

рдкреНрд░рдгрд╛рд▓реА:
рдУрдПрд╕: рдореИрдХреЛрдЬрд╝ 10.14.5
рд╕реАрдкреАрдпреВ: (16) x64 рдЗрдВрдЯреЗрд▓ (рдЖрд░) рдХреЛрд░ (рдЯреАрдПрдо) i9-9880H рд╕реАрдкреАрдпреВ @ 2.30GHz
рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝:
рдиреЛрдб: 10.16.0 - /usr/рд▓реЛрдХрд▓/рдСрдкреНрдЯ/рдиреЛрдб@10/рдмрд┐рди/рдиреЛрдб
рдпрд╛рд░реНрди: 1.17.3 - ~/рд╡рд░реНрдХрд╕реНрдкреЗрд╕/рдШрдЯрдХ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕/.рдмрд┐рди/рдпрд╛рд░реНрди
рдПрдирдкреАрдПрдо: 6.9.0 - /usr/рд▓реЛрдХрд▓/рдСрдкреНрдЯ/рдиреЛрдб@10/рдмрд┐рди/рдПрдирдкреАрдПрдо
рдмреНрд░рд╛рдЙрдЬрд╝рд░:
рдХреНрд░реЛрдо: 76.0.3809.100
рд╕рдлрд╛рд░реА: 12.1.1
рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ:
@storybook/addon-a11y: ^5.2.0-beta.36 => 5.2.0-beta.38
@storybook/addon-actions: ^5.2.0-beta.36 => 5.2.0-beta.38
@storybook/addon-docs: ^5.2.0-beta.36 => 5.2.0-beta.38
@ Storybook/addon-knobs: ^5.2.0-beta.36 => 5.2.0-beta.38
@ Storybook/addon-links: ^5.2.0-beta.36 => 5.2.0-beta.38
@storybook/addon-viewport: ^5.2.0-beta.36 => 5.2.0-beta.38
@storybook/addons: ^5.2.0-beta.36 => 5.2.0-beta.38
@ рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдкреНрд░реАрд╕реЗрдЯ-рдПрд╕рд╕реАрдПрд╕рдПрд╕: 1.0.2 => 1.0.2
@ рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдкреНрд░реАрд╕реЗрдЯ-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ: 1.1.0 => 1.1.0
@рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: ^5.2.0-рдмреАрдЯрд╛.36 => 5.2.0-рдмреАрдЯрд╛.38
@ рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдереАрдорд┐рдВрдЧ: ^5.2.0-рдмреАрдЯрд╛.36 => 5.2.0-рдмреАрдЯрд╛.38

docs storysource source compatibility with other tools has workaround inactive typescript

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдпрджрд┐ рдЖрдк рднрдпрд╛рдирдХ-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

/* tsconfig.json */
{
  "compilerOptions": { },
  "awesomeTypescriptLoaderOptions": {
    "ignoreDiagnostics": [7005]
  }
}

рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 69 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдзрдиреНрдпрд╡рд╛рдж @enagy27! рдпрд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

1) source-loader рдЯрд╛рдЗрдкрдкреНрд░рддрд┐-рдорд┐рддреНрд░ рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
2) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ)
3) source-loader рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП @ts-ignore рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реАрдзрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╣реИ

рдорд╣рд╛рди рд╕реАрдЬрд╝рд░ рдХрд╛ рднреВрдд !! рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА https://github.com/storybookjs/storybook/releases/tag/v5.2.0-beta.39 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ PR #7831 рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд╣реА рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ!

рдЖрдк рдЗрд╕ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рдХреЛ @next NPM рдЯреИрдЧ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдФрд░ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред

@ enagy27 рдореЗрдВ рд░реЗрдкреНрд░реЛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

@shilman рдмрд┐рд▓реНрдХреБрд▓! рдЗрд╕реЗ рдЕрдм рдПрдХ рд╢реЙрдЯ рджреЗ рд░рд╣реЗ рд╣реИрдВред рд╢реБрдХреНрд░рд┐рдпрд╛!

@shilman рдЕрднреА рднреА рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ beta.39 рдкрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ

ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx
./src/elements/tag/tag.stories.tsx
[tsl] ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx(69,52)
      TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.

ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx
./src/elements/tag/tag.stories.tsx
[tsl] ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx(74,3)
      TS2300: Duplicate identifier 'parameters'.

npx -p @storybook/cli<strong i="10">@next</strong> sb info

Environment Info:

  System:
    OS: macOS 10.14.5
    CPU: (16) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
  Binaries:
    Node: 10.16.0 - /usr/local/opt/node@10/bin/node
    Yarn: 1.17.3 - ~/workspace/component-library/node_modules/.bin/yarn
    npm: 6.9.0 - /usr/local/opt/node@10/bin/npm
  Browsers:
    Chrome: 76.0.3809.100
    Safari: 12.1.1
  npmPackages:
    @storybook/addon-a11y: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addon-actions: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addon-docs: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addon-knobs: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addon-links: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addon-viewport: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/addons: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/preset-scss: 1.0.2 => 1.0.2 
    @storybook/preset-typescript: 1.1.0 => 1.1.0 
    @storybook/react: ^5.2.0-beta.39 => 5.2.0-beta.39 
    @storybook/theming: ^5.2.0-beta.39 => 5.2.0-beta.39

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рд▓реЛрдбрд░ рдкрд░ рд╣реИ, рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░реАрд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдкреНрд░реАрд╕реЗрдЯ рдХреА рдПрдХ рдирдИ рд░рд┐рд▓реАрдЬрд╝ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

@ enagy27 рдХреНрдпрд╛ рдЖрдк рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдкрд░ рдПрдХ рдирдЬрд╝рд░ .mdx рдХреЛ .tsx рдмрджрд▓реЗрдВ рдФрд░ рдмрд╛рдХреА рдХреЛ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

https://github.com/storybookjs/storybook/blob/next/addons/docs/docs/faq.md#how -do-i-debug-my-mdx-story

@shilman рдореИрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ рдЬрдм sourceLoaderOptions: null рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд╣реИ ЁЯШЮ рдЕрдиреНрдпрдерд╛ рдПрдХ рдЕрд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрд░реЛрдд рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рдХреНрдпрд╛ рдкрд╣рд▓реЗ рдЕрд╕рдлрд▓ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдмрд╛рдп-рдкрд╛рд╕ рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╡реНрд╣реВрдкреА !! рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА https://github.com/storybookjs/storybook/releases/tag/v5.2.0-beta.40 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ PR #7845 рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд╣реА рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ!

рдЖрдк рдЗрд╕ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рдХреЛ @next NPM рдЯреИрдЧ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@enagy27 рдиреЗ рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдорд░реНрдЬ рдХрд┐рдП рдФрд░ рдЬрд╛рд░реА рдХрд┐рдПред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдЗрдП?

@shilman рдРрд╕реА рдХреЛрдИ рдХрд┐рд╕реНрдордд рдирд╣реАрдВ ЁЯШЮ рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд▓рдЯрдХрд╛ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рднреА рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдФрд░ рдЙрди рд╕рднреА рдХреЛ as any рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЪрд░ parameters рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ __STORY__ рдареАрдХ рд╕реЗ рдмрдЪ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдЯреАрдПрд╕ рдирд╣реАрдВ ... рдореИрдВ рд╕реНрдЯрдореНрдкреНрдб рд╣реВрдВ

рдореИрдВ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реА tsconfig.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА "рд╕рдЦреНрдд" рдЯрд╛рдЗрдкрдЪреЗрдХрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИ (рдпрд╛ рддреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ tsconfig рдпрд╛ .storybook/tsconfig.js (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ))ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ рдХрд┐ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ:
image

@libetl рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВред

@JonKrone рдЬрдм рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдбреЙрдХреНрд╕ рдЯреИрдм рдореЗрдВ рд╕реЛрд░реНрд╕ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдпреЗ рд╕рдВрд╢реЛрдзрди рдХрд┐рдП рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рд╕реНрд░реЛрдд рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ

рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдпрджрд┐ рдЖрдк рднрдпрд╛рдирдХ-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

/* tsconfig.json */
{
  "compilerOptions": { },
  "awesomeTypescriptLoaderOptions": {
    "ignoreDiagnostics": [7005]
  }
}

рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@shilman рдХреНрдпрд╛ рдЖрдк рдпрд╣реА рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ? FYI рдХрд░реЗрдВ рдпрд╣ TS7005 рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдирд╣реАрдВ рдмрдиреЗрдЧрд╛ (рдХреЛрдИ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ)ред

  // @ts-ignore
  var withSourceLoader = require('@storybook/source-loader/preview').withSource;
  // @ts-ignore
  var __SOURCE_PREFIX__ = "/home/user/projects/real/ts/my-blog-react/src/graphql";
  // @ts-ignore
  var __STORY__ = "import React from \"react\";\n\nimport { ApolloProvider } from \"@apollo/react-hooks\";\nimport { storiesOf } from \"@storybook/react\";\n\nimport { Posts } from \"../views/Posts/index\"; // ! Fix coupling\nimport { PostContent } from \"../views/PostContent\"; // ! Fix coupling\nimport { withPostContentQuery } from \"./components/withPostContentQuery\";\nimport { withPostsQuery } from \"./components/withPostsQuery\";\nimport * as fakeQl from \"./fakeql/fakeql-endpoints\";\nimport apolloClientFactory from \"./apollo\";\n\n// FIXME: #coupling - find a way to not depend on Post and Container, probably fakes - but not good enough.\n\nconst apolloClient = apolloClientFactory(fakeQl.normalApiEndpoint);\nconst PostContentQuery = withPostContentQuery(PostContent);\nconst PostsQuery = withPostsQuery(Posts);\n\n// ~~~ Posts ~~~\nstoriesOf(\"GraphQL\", module).add(\"PostsQuery\", () => (\n  <ApolloProvider client={apolloClient}>\n    <PostsQuery routeHandler={() => null} />\n  </ApolloProvider>\n));\n\n// ~~~ PostContent ~~~\nstoriesOf(\"GraphQL\", module).add(\"PostContentQuery\", () => (\n  <ApolloProvider client={apolloClient}>\n    <PostContentQuery postId=\"1\" />\n  </ApolloProvider>\n));\n";
  // @ts-ignore
  var __ADDS_MAP__ = {"graphql--postsquery":{"startLoc":{"col":33,"line":20},"endLoc":{"col":1,"line":24},"startBody":{"col":47,"line":20},"endBody":{"col":1,"line":24}},"graphql--postcontentquery":{"startLoc":{"col":33,"line":27},"endLoc":{"col":1,"line":31},"startBody":{"col":53,"line":27},"endBody":{"col":1,"line":31}}};
  // @ts-ignore
  var __MAIN_FILE_LOCATION__ = "/root.stories.tsx";
  // @ts-ignore
  var __MODULE_DEPENDENCIES__ = [];
  // @ts-ignore
  var __LOCAL_DEPENDENCIES__ = {};
  // @ts-ignore
  var __IDS_TO_FRAMEWORKS__ = {};

  import React from "react";

import { ApolloProvider } from "@apollo/react-hooks";
import { storiesOf } from "@storybook/react";

import { Posts } from "../views/Posts/index"; // ! Fix coupling
import { PostContent } from "../views/PostContent"; // ! Fix coupling
import { withPostContentQuery } from "./components/withPostContentQuery";
import { withPostsQuery } from "./components/withPostsQuery";
import * as fakeQl from "./fakeql/fakeql-endpoints";
import apolloClientFactory from "./apollo";

// FIXME: #coupling - find a way to not depend on Post and Container, probably fakes - but not good enough.

const apolloClient = apolloClientFactory(fakeQl.normalApiEndpoint);
const PostContentQuery = withPostContentQuery(PostContent);
const PostsQuery = withPostsQuery(Posts);

// ~~~ Posts ~~~
storiesOf("GraphQL", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).add("PostsQuery", () => (
  <ApolloProvider client={apolloClient}>
    <PostsQuery routeHandler={() => null} />
  </ApolloProvider>
));

// ~~~ PostContent ~~~
storiesOf("GraphQL", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).add("PostContentQuery", () => (
  <ApolloProvider client={apolloClient}>
    <PostContentQuery postId="1" />
  </ApolloProvider>
));


@ 0b10 рдореИрдВ рдЗрд╕реЗ tsconfig.json рдХреЛ рднреА рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛

рд╕реНрдЯреЛрд░реАрдмреБрдХ-рд░рд┐рдПрдХреНрд╢рди-рд░рд╛рдЙрдЯрд░ рдХреЛ 1.0.6 рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рдереАрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреБрд▓рд╛ рд╣реИ: gvaldambrini/storybook-router#42 рдореБрдЭреЗ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ (рд╕реНрдЯреЛрд░реАрдмреБрдХ-рд░рд╛рдЙрдЯрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╢рд╛рдпрдж рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдереАрдВ, рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ )

рдореЗрд░реА TSX рдХрд╣рд╛рдирд┐рдпреЛрдВ рдкрд░ "рдХреЛрдИ рдХреЛрдб рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ", MDX рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди/рдмрд┐рд▓реНрдХреБрд▓ @ 0b10 рдХреА рдХрд╣рд╛рдиреА рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

  // @ts-ignore
  var withSourceLoader = require('@storybook/source-loader/preview').withSource;
  // @ts-ignore
  var __SOURCE_PREFIX__ = "C:\\Workspace\\application-ui\\src\\components\\atoms\\container";
  // @ts-ignore
  var __STORY__ = "import { storiesOf } from \"@storybook/react\";\nimport React, { ReactElement } from \"react\";\n\nimport { Container } from \"components\";\n\nconst stories = storiesOf(\"Atoms/Container\", module).addParameters({ component: Container });\n\nstories.add(\"Default\", (): ReactElement => <Container>Hello</Container>);\n";
  // @ts-ignore
  var __ADDS_MAP__ = {};
  // @ts-ignore
  var __MAIN_FILE_LOCATION__ = "/Container.stories.tsx";
  // @ts-ignore
  var __MODULE_DEPENDENCIES__ = [];
  // @ts-ignore
  var __LOCAL_DEPENDENCIES__ = {};
  // @ts-ignore
  var __IDS_TO_FRAMEWORKS__ = {};

  import { storiesOf } from "@storybook/react";
import React, { ReactElement } from "react";

import { Container } from "components";

const stories = storiesOf("Atoms/Container", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).addParameters({ component: Container });

stories.add("Default", (): ReactElement => <Container>Hello</Container>);

рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ config.js рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл docs: DocsPage

    docs: {
        container: DocsContainer,
        page: DocsPage,
    },

рдкреНрд░реАрд╕реЗрдЯ:

module.exports = [
    {
        name: "@storybook/addon-docs/react/preset",
        options: {
            configureJSX: true,
        },
    },
];

рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНтАНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рд╕рдВрднрд╡рдд: рдЖрд╡рд╢реНтАНрдпрдХ рдирд╣реАрдВ рд╣реИ?

    config.module.rules.push({
        exclude: /node_modules/,
        test: /\.(ts|tsx)$/,
        use: [
            {
                loader: require.resolve("babel-loader"),
                options: {
                    presets: [["react-app", { flow: false, typescript: true }]],
                },
            },
            {
                loader: require.resolve("react-docgen-typescript-loader"),
            },
        ],
    });

    config.module.rules.push({
        enforce: "pre",
        include: [path.resolve(__dirname, "../src")],
        loader: require.resolve("@storybook/source-loader"),
        test: /\.(stories|story)\.[tj]sx?$/,
    });

tsconfig.json рдореЗрдВ "noImplicitAny": true рдФрд░ рдХреЛрдИ ignoreDiagnostics рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ

rc.4 рд╕рд╛рде рдЕрдм рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕реНрд░реЛрдд рдирд╣реАрдВ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ #6641 рдореЗрдВ рднреА рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ

рдореБрдЭреЗ рдПрдХ рдЙрдкрд╛рдп рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ!

  • рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп sourceLoaderOptions: null , рдореИрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ transpileOnly: true рдореЗрд░реА рдореЗрдВ tsLoaderOptions
  • #8055 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп parameters рдЪрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛
  • рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, as 'optionA' | 'optionB' рдЬреИрд╕реЗ рджрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рдФрд░ рдЗрд╕реЗ рдмрд╛рдПрдВ рд╣рд╛рде рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред

рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

const colors = {
  primary: 'primary',
  secondary: 'secondary',
};

const color = radios('color', colors, colors.primary) as ButtonColor;

рдпрд╣ рдХрд╛рдо:

const colors: Record<string, ButtonColor> = {
  primary: 'primary',
  secondary: 'secondary',
};

const color = radios('color', colors, colors.primary);

рдЕрдВрдд рдореЗрдВ рдпрд╣ рдЯрд╛рдЗрдк рдЕрдиреБрдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп source-loader рдореБрджреНрджреЗ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд╡реИрд╕реЗ рднреА, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ!

@ enagy27 рдЖрдкрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЙрдХ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ @libetl 5.3 рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп рдСрдирд▓рд╛рдЗрди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ source-loader рдЕрдкрдЧреНрд░реЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░! рдореИрдВ

рдирдорд╕реНрддреЗред рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ?

@simonhoss рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рднреА

TS рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЛ react-docgen-typescript-loader рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ addon-info рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ addon-docs addon-info рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ TS рдХреЗ рд╕рд╛рде addon-docs рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП TS рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реЗрдЯрдЕрдк рдпрд╛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдФрд░ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдпреЗ рдЯреБрдХрдбрд╝реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ! рдореИрдВ

рдЕрдм рдЬрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬрд╛рд░реА рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cra- ts-

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/addons.js

import '@storybook/addon-knobs/register';
import '@storybook/addon-a11y/register';
import '@storybook/addon-actions/register';

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/config.js

import { configure, addDecorator, addParameters } from '@storybook/react';
import { withA11y } from '@storybook/addon-a11y';
import { withKnobs } from '@storybook/addon-knobs';

import theme from './theme';
import '../stylesheets/gusto.scss';

// This file overrides styles from the global Gusto
// styles which interfere with Storybook styles
import './storybook.scss';

// Is your addon not showing up? Try looking for a `register` function
// and add it to .storybook/addons.js
addDecorator(withA11y);
addDecorator(withKnobs);

addParameters({
  // storybook built-in
  // more info available here:
  // https://storybook.js.org/docs/configurations/options-parameter/
  options: {
    showPanel: true,
    panelPosition: 'right',
    // https://storybook.js.org/docs/configurations/theming/
    theme,
  },
  knobs: {
    escapeHTML: false,
  },
  // viewport structure here:
  // https://github.com/storybookjs/storybook/tree/master/addons/viewport#use-custom-set-of-devices
  // viewport: {
  //   defaultViewport: 'iphone6',
  //   type: 'mobile',
  // },
});

configure(require.context('../src', true, /\.stories\.(js|jsx|ts|tsx|mdx)$/), module);

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдкреНрд░реАрд╕реЗрдЯ.рдЬреЗрдПрд╕

const path = require('path');

module.exports = [
  '@storybook/preset-scss',
  {
    name: '@storybook/preset-typescript',
    options: {
      // Point the loader here to override the root "noEmit" compilerOption
      tsLoaderOptions: {
        // Transpile only means no type-checking from storybook, which greatly speeds up
        // builds. Types will be checked as part of the normal build process. This may also
        // be necessary for loading story source
        transpileOnly: true,
        configFile: path.resolve(__dirname, 'tsconfig.json'),
      },
      // We must use our config to ensure props and their comments are loaded
      tsDocgenLoaderOptions: {
        tsconfigPath: path.resolve(__dirname, 'tsconfig.json'),
        // https://github.com/styleguidist/react-docgen-typescript#parseroptions
        propFilter: prop => {
          if (prop.parent) {
            return !prop.parent.fileName.includes('node_modules/@types/react/');
          }

          return true;
        },
      },
    },
  },
  '@storybook/addon-docs/react/preset',
];

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/рдереАрдо.рдЬреЗрдПрд╕

рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн config.js ред

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/tsconfig.json

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗрд╡рд▓ рд░реВрдЯ tsconfig.json рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдпрд╣рд╛рдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "noEmit": false
  }
}

рд╣рд╛рдп @ enagy27 - рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рдЕрдЬреАрдм рдХрд╛рд░рдг рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ, рдпрд╛рдиреА - рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реА рдкреНрд░реЙрдкреНрд╕ рдЯреЗрдмрд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ:

SomeType['property'] рдЕрднреА рдореИрдВ рдПрдХ рд╕рдВрдШ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ any рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдирдорд╕реНрддреЗ, @ enagy27ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рдореИрдВ tsx рдХреЗ рд╕рд╛рде рдШрдЯрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдШрдЯрдХ рд╡рд┐рд╡рд░рдг рдФрд░ рдкреНрд░реЛрдк рд╡рд┐рд╡рд░рдг рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ jsxуАВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
image
image
image

рд╣рд╛рдп @ рдЬреАрд░реЛрдлреНрд░рдВрдЯред рдореБрдЭреЗ рдЗрд╕ рд╕рдЯреАрдХ рдЯрд┐рдкреНрдкрдгреА рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдкрдбрд╝рд╛

рдШрдЯрдХ рд╡рд┐рд╡рд░рдг:

/**
 * This is a component description and should sit directly above your component
 */

рдкреНрд░реЛрдк рд╡рд┐рд╡рд░рдг:

/** I am a prop description and should sit directly above the interface property i am describing */

@ enagy27 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЖрдкрдХреА рдкрд╣рд▓реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЯрд┐рдкреНрдкрдгреА рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдерд╛

@zerofront рдЖрдкрдХреЛ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп export const Button: React.FC<BaseButtonProps> = props => {...} рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

TS рдФрд░ docgen рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рд╕реЗрдЯрдЕрдк рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдБ #8133 рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХреА рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ

@zerofront рдореЗрд░реЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЖрдкрдХреЗ рдмрдЯрди рдбреЙрдХреНрд╕ рдХреЗ рдкреНрд░реЙрдкреНрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рд╕реНрдЯреЛрд░реАрдмреБрдХ BaseButtonProps рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрдЬрд╛рдп defaultProps рдкреНрд░рд┐рдВрдЯ рдХрд░ рд░рд╣реА рд╣реИред рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╡рд░рдг рднреА рдпрд╛рдж рдЖрддреА рд╣реИред рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдХрд╣рд╛рдиреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

export default {
  title: 'Button',
  component: Button,
  parameters: {
    componentSubtitle: 'Handy status label',
  },
}

@zerofront рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @ enagy27 рдиреЗ рдХреНрдпрд╛ рдХрд╣рд╛ред
*.stories.tsx рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

.рд╕реНрдЯреЛрд░реАрдмреБрдХ/webpack.config.js

const path = require('path');
const include = path.resolve(__dirname, '../src');

module.exports = ({ config }) => {
  config.module.rules.push({
    test: /\.ts(x?)$/,
    exclude: /node_modules/,
    use: [
      {
        loader: require.resolve('babel-loader'),
        options: {
          presets: [['react-app', { flow: false, typescript: true }]],
        },
      },
    ],
    include,
  });
  return config;
};

@zerofront рдЖрдкрдХреЛ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп export const Button: React.FC<BaseButtonProps> = props => {...} рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@zerofront @ enagy27 рдХрд▓ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░рд╛ рдореБрджреНрджрд╛ (рдЬреЛ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ @zerofront рдХрд╛ рд╣реА рдерд╛) рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдерд╛ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рд╣реИ:

- import React from 'react'
+ import React, { FC } from 'react'

- export const Button: React.FC<Props>
+ export const Button: FC<Props>

рд╕реНрд░реЛрдд:
https://github.com/strothj/react-docgen-typescript-loader/issues/42#issuecomment -535090697
рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдиреЛрдЯ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
https://github.com/strothj/react-docgen-typescript-loader#react -component-class-import

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@sergiop @enagy27 рдзрдиреНрдпрд╡рд╛рдж! рдЕрдВрдд рдореЗрдВ, рд╕рд╣рд╛рд░рд╛ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛рдо рд╣реИред
рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдкреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
image

image

@zerofront рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрджреНрджреЛрдВ рдХреА рдореЗрд░реА рдЯреВ-рдбреВ рд╕реВрдЪреА рдореЗрдВ рд╣реИред ;-)
рдпрджрд┐ рдЖрдк рдХрд╛рд░рдг рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ react-docgen-typescript-loader ред

@zerofront рд╢рд╛рдпрдж рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред ;-)

рдореБрдЭреЗ рдбреА-рд╕реНрдЯреНрд░рдХреНрдЪрд░рд┐рдВрдЧ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлреЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕реМрднрд╛рдЧреНрдп рдорд┐рд▓рд╛ рд╣реИред рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЧреИрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрд░реНрдерд╛рдд:

const Text = ({
text: 'Hello world'
}: Props) => <p>{text}</p>

рдореБрдЭреЗ рдбреА-рд╕реНрдЯреНрд░рдХреНрдЪрд░рд┐рдВрдЧ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рджреМрд░рд╛рди рдбрд┐рдлреЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕реМрднрд╛рдЧреНрдп рдорд┐рд▓рд╛ рд╣реИред рдмрд╣реБрдд рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЧреИрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрд░реНрдерд╛рдд:

const Text = ({
text: 'Hello world'
}: Props) => <p>{text}</p>

@ sami616 рдореИрдВ рдЖрдкрдХреЗ рдЬреИрд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ @zerofront рдкрд╣рд▓реЗ рд╣реА рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ, рд╣рд╛рдБ, рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

@ sami616 , рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдереЛрдбрд╝реА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрд░реЛрдд storybook рдпрд╛ react-docgen-typescript-loader ред рдЗрд╕ рддрд░рд╣ рдореИрдВ рд╕рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЗрд╢реНрдпреВ рдЦреЛрд▓реВрдВрдЧрд╛ред

@sami616 @sergiop
рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЙрдХрдЬреЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рд╕рдВрд╕реНрдХрд░рдг 3.2.1 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ
рдореБрдЭреЗ node_modules/react-docgen-typescript-loader/dist/generateDocgenCodeBlock рдореЗрдВ рдХреБрдЫ рдХреЛрдб рдорд┐рд▓реЗ

var setDefaultValue = function(defaultValue) {
    return typescript_1.default.createPropertyAssignment(
      typescript_1.default.createLiteral('defaultValue'),
      // Use a more extensive check on defaultValue. Sometimes the parser
      // returns an empty object.
      defaultValue != null && typeof defaultValue === 'object' && 'value' in defaultValue && typeof defaultValue.value === 'string'
        ? typescript_1.default.createObjectLiteral([
            typescript_1.default.createPropertyAssignment(
              typescript_1.default.createIdentifier('value'),
              typescript_1.default.createLiteral(defaultValue.value),
            ),
          ])
        : typescript_1.default.createNull(),
    );
  };

&& typeof defaultValue.value === 'string'

рдпрд╣ рд╕реНрдерд┐рддрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдк рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреА рд╣реИред

рдФрд░ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 3.3.0 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЙрдХрдЬреЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рдореЗрдВ, рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧуАБрдирдВрдмрд░уАБрдмреВрд▓рд┐рдпрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

https://github.com/strothj/react-docgen-typescript-loader/blob/master/src/generateDocgenCodeBlock.ts

const setDefaultValue = (
    defaultValue: { value: string | number | boolean } | null,
  ) =>
    ts.createPropertyAssignment(
      ts.createLiteral("defaultValue"),
      // Use a more extensive check on defaultValue. Sometimes the parser
      // returns an empty object.
      defaultValue != null &&
        typeof defaultValue === "object" &&
        "value" in defaultValue &&
        (typeof defaultValue.value === "string" ||
          typeof defaultValue.value === "number" ||
          typeof defaultValue.value === "boolean")
        ? ts.createObjectLiteral([
            ts.createPropertyAssignment(
              ts.createIdentifier("value"),
              ts.createLiteral(defaultValue!.value),
            ),
          ])
        : ts.createNull(),
    );

@zerofront ,

@zerofront рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ react-docgen-typescript-loader рд╕реЗ 3.3.0 рддрдХ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред рдзрдиреНрдпрд╡рд╛рджред
Screenshot 2019-10-10 at 12 00 16

рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдпрджрд┐ рдЖрдк рднрдпрд╛рдирдХ-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

/* tsconfig.json */
{
  "compilerOptions": { },
  "awesomeTypescriptLoaderOptions": {
    "ignoreDiagnostics": [7005]
  }
}

рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЖрдЬ рд╣реА рел.рез рд╕реЗ рел.реи.рел рддрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдЕрднреА рддрдХ рдПрдбрдСрди-рдбреЙрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдЕрднреА рднреА рдкреНрд░рд╢реНрди, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╛ рдмрдЧ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд░ рдореБрджреНрджреЗ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред рд╣рдо рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЦреБрд▓реЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВред рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореБрджреНрджреЗ 30 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рдмрдВрдж рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдВрд╕реНрдХрд░рдг "@storybook/react": "5.2.6" рдФрд░ "react-docgen-typescript-loader": "3.6.0" рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рдВрджрд░реНрднрд┐рдд рдкреАрдЖрд░ рдореЗрдВ // @ts-ignore s рдХреЛ __MODULE_DEPENDENCIES__ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХрдорд╛рддреНрд░ рдлрд╝рд╛рдЗрд▓ src/server/build.js рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдЕрднреА рднреА src рдореЗрдВ рдЕрдирджреЗрдЦрд╛ рд╣реИ

@jalooc рдХреГрдкрдпрд╛ 5.3 рдмреАрдЯрд╛ рджреЗрдЦреЗрдВред рдкреНрд░реЙрдкреНрд╕ рдЯреЗрдмрд▓ рдореЗрдВ рдвреЗрд░ рд╕рд╛рд░реЗ рд╕реБрдзрд╛рд░ред

@shilman рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдмреАрдЯрд╛.6 рдкрд░ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдЖрдЬрдорд╛рдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдирд╡реАрдирддрдо . рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛

рдореБрдЭреЗ рдЕрднреА рднреА рд╕реНрдЯреЛрд░реАрдмреБрдХ 5.3 рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред [email protected] рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЙрдХрдЬреЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ 3.6.0ред

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ "noImplicitAny": false рдХреЛ tsconfig.json рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛ рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

рдореБрдЭреЗ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ:
TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдлреЙрд▓реЛ рдЕрдк рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ @enagy27 рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд transpileOnly рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдкреВрд░реНрдг рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░рд╛ presets.js ред tsconfig.json рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ:

// presets.js
const path = require("path");

module.exports = [
    {
        name: "@storybook/preset-typescript",
        options: {
            tsLoaderOptions: {
                configFile: path.resolve(__dirname, "../tsconfig.json"),
                transpileOnly: true,
            },
            tsDocgenLoaderOptions: {
                tsconfigPath: path.resolve(__dirname, "../tsconfig.json"),
            },
            include: [path.resolve(__dirname, "../src")],
        },
    },
    {
        name: "@storybook/addon-docs/react/preset",
        options: {
            configureJSX: true,
            //sourceLoaderOptions: null,
        },
    },
];

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рд╣рдо TS рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реАрдмреБрдХ рдРрдбрдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рднреА рдЗрд╕реЗ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ
"рд╡реИрд░рд┐рдПрдмрд▓ '__MODULE_DEPENDENCIES__' рдХрд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ 'рдХреЛрдИ рднреА []' рдкреНрд░рдХрд╛рд░ рд╣реИред"

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЛ 5.3.0-рдмреАрдЯрд╛.16 рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдП рдЧрдП рдЕрдиреНрдп рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

рдореБрдЭреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░реЙрдкреНрд╕ рдЯреЗрдмрд▓ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реАрдмреБрдХ рдПрдбрдСрди-рдбреЙрдХреНрд╕ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреЗред рдпрд╣ рд╕рд┐рд░реНрдл "рдХреЛрдИ рдШрдЯрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛" рдХрд╣рддрд╛ рд╣реИред

addons.js

import '@storybook/addon-knobs/register'
import '@storybook/addon-a11y/register'
import '@storybook/addon-docs/register'

рдкреНрд░реАрд╕реЗрдЯ.рдЬреЗрдПрд╕

module.exports = [
  {
    name: "@storybook/addon-docs/react/preset",
    options: {
      configureJSX: true,
    }
  }
]

webpack.config.js

const path = require('path')
const SRC_PATH = path.join(__dirname, '../src')

module.exports = ({ config }) => {
    config.module.rules.push({
        test: /\.(ts|tsx|js|jsx)$/,
        include: [SRC_PATH],
        use: [
            {
                loader: require.resolve('babel-loader'),
                options: {
                    presets: [['react-app', { flow: false, typescript: true }]],
                    plugins: ['babel-plugin-styled-components']
                },
            },
            {
                loader: require.resolve('react-docgen-typescript-loader'),
                options: {
                    tsconfigPath: path.resolve(__dirname, '../tsconfig.json'),
                },
            },
            {
                loader: require.resolve('@storybook/source-loader'),
                options: { parser: 'typescript',  injectParameters: true, },
            },
        ],
        exclude: [/node_modules/],
        enforce: 'pre',

    })

    config.resolve.extensions.push('.ts', '.tsx', '.js', '.jsx')
    return config
}

рд╕реНрдЯреЛрд░реАрдмреБрдХ 5.2.8
рдПрдбрдСрди-рдбреЙрдХреНрд╕ 5.2.8
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЙрдХрдЬреЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ 3.6.0
рдмреЗрдмреЗрд▓-рд▓реЛрдбрд░ 8.0.6
@рд╕реНрдЯреЛрд░реАрдмреБрдХ/рд╕реЛрд░реНрд╕-рд▓реЛрдбрд░ 5.2.8

рд╕рд╛рде рд╣реА, рдЕрдЧрд░ рдореИрдВ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реНрдЯреЛрд░реА рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рд╡рд╣ рдШрдЯрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдвреВрдВрдврддрд╛ рд╣реИ (рдХреИрдирд╡рд╛рд╕ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рдореЗрдиреВ рдЦрд╛рд▓реА рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рд╕рдЦреНрдд рдирд┐рдпрдореЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдХреЗ tsconfig.json рдХреА рдУрд░ рдбреЙрдХ рдЬреЗрдирд░реЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпреЗ рдореЗрд░реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИрдВ, рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧрд┐рдЯ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
Capture1
Capture2
Capture3
Capture4

++ рдЗрдЯреНрд╕
рдирд┐рд░реНрдпрд╛рдд рдХреЙрдиреНрд╕реНрдЯ рдЕрдХреЙрд░реНрдбрд┐рдпрдирдЖрдЗрдЯрдо
рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ webpack.config.js рдирд╣реАрдВ рд╣реИ

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдЕрдВрддрддрдГ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЙрдХрдЬреЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░ рдХреЗ рдХреБрдЫ рджрд░реНрджрдирд╛рдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реВрдВред

React-docgen-typescript-loader рдлрд╝реЛрд▓реНрдбрд░ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ __docgeninfo рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдХ рдирд╛рдо рдХрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдЙрд╕реА рдирд╛рдо (рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓) рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

|__
  CTALink
    |___index.tsx

рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрдл рдкреНрд░рд╛рд░реВрдк рдирд╣реАрдВ рдорд┐рд▓рд╛ (рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА), рд▓реЗрдХрд┐рди storiesOf рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкреНрд░реЙрдкреНрд╕ рдЯреЗрдмрд▓ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕реЗ addParameters рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдЯрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред .

storiesOf('CTALink', module)
  .addParameters({
    component: CTALink,
  })
  .add('default story', () => (
    <CTALink to="/">Click here</CTALink>
  ))

рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ! рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдЕрднреА рднреА рдкреНрд░рд╢реНрди, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╛ рдмрдЧ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдмреЗрдЭрд┐рдЭрдХ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рд░ рдореБрджреНрджреЗ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред рд╣рдо рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЦреБрд▓реЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВред рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореБрджреНрджреЗ 30 рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рдмрдВрдж рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдзрдиреНрдпрд╡рд╛рдж!

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 5.3 рдореЗрдВ рд╕реНрд░реЛрдд рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдорд╛рдкрдиред

рдореИрдВрдиреЗ @storybook/react рдФрд░ @storybook/addon-docs рд╕реЗ 5.3.0-rc.4 рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type. рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд░рд╣реЗрдВ

рдореИрдВ рдкреНрд░реАрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рднреА рдирдпрд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдВ рдХреА рд╣реИрдВред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ webpack.config.js рд╣реИ:
`` `рдХреЙрдиреНрд╕реНрдЯ рдкрде = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдкрде');

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
рдиреЛрдб: {
рдПрдлрдПрд╕: 'рдЦрд╛рд▓реА',
рдЪрд╛рдЗрд▓реНрдб_рдкреНрд░реЛрд╕реЗрд╕: 'рдЦрд╛рд▓реА'
},
рд╕рдВрдХрд▓реНрдк: {
рдореЙрдбреНрдпреВрд▓: [
'рдиреЛрдб_рдореЙрдбреНрдпреВрд▓',
],
рдПрдХреНрд╕рдЯреЗрдВрд╢рди: [.ts", ".tsx"],
рд╕рд┐рдореНрд▓рд┐рдВрдХ: рд╕рдЪ
},
рдорд╛рдкрд╛рдВрдХ: {
рдирд┐рдпрдо: [
{
рдкрд░реАрдХреНрд╖рдг: /ред (рдЯреАрдПрд╕ | рдЯреАрдПрд╕рдПрдХреНрд╕) $ /,
рдЙрдкрдпреЛрдЧ: [
{
рд▓реЛрдбрд░: requ.resolve ('рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд▓реЛрдбрд░')
},
{
рд▓реЛрдбрд░: requ.resolve('react-docgen-typescript-loader')
},
]
},
{
рдкрд░реАрдХреНрд╖рдг: /.(рдХрд╣рд╛рдирд┐рдпрд╛рдВ|рдХрд╣рд╛рдиреА)ред[tj]sx?$/,
рд▓реЛрдбрд░: requ.resolve('@storybook/source-loader')
}
]
},
рдмрд╛рд╣рд░реА: {
'рдХреНрд▓рд╛рд╕-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░': 'рдХреНрд▓рд╛рд╕-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░'
}
};
```

рдпреЛ-рд╣реЛ-рд╣реЛ !! рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА https://github.com/storybookjs/storybook/releases/tag/v5.3.0-rc.5 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ PR #9272 рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рд╣реА рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ!

рдЖрдк рдЗрд╕ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рдХреЛ @next NPM рдЯреИрдЧ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@JacopoBonta рдХреНрдпрд╛ рдЖрдк рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ 5.3.0-rc.5 рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдирдорд╕реНрддреЗ @shilman рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрджреНрднреБрдд рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВрдиреЗ 5.3.0-rc.5 рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.

рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ ignoreDiagnostics: [7005] рдХреЛ ts-loader рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВ рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ main.js :

const { addons } = require('@storybook/addons');
const path = require('path');
const tsImportPluginFactory = require('ts-import-plugin')

module.exports = {
  stories: ['../packages/**/*.stories.(tsx|mdx)'],
  presets: [
    {
      name: '@storybook/preset-typescript',
      options: {
        tsLoaderOptions: {
          configFile: path.resolve(__dirname, 'tsconfig.json'),
          ignoreDiagnostics: [7005],
          getCustomTransformers: () => ({
            before: [ tsImportPluginFactory(
              {
                libraryName: 'antd',
                style: 'css',
                libraryDirectory: 'es'
              }
            ) ]
          }),
        },
        tsDocgenLoaderOptions: {
          tsconfigPath: path.resolve(__dirname, 'tsconfig.json'),
        },
        forkTsCheckerWebpackPluginOptions: {
          colors: false, // disables built-in colors in logger messages
        },
        include: [path.resolve(__dirname, "../packages")]
      },
    },
    {
      name: '@storybook/addon-docs/preset',
      options: {
      }
    }],
  addons: [
    '@storybook/addon-docs/register',
    '@storybook/addon-knobs/register',
    '@storybook/addon-actions/register',
    '@storybook/addon-links/register'
  ],
};

@JacopoBonta рдХреНрдпрд╛ рдЖрдк рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ 5.3.0-rc.5 рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди 5.3.0-rc.5 рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓рд╛ред
рдореИрдВрдиреЗ @storybook/react рдФрд░ @storybook/addon-docs рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд░рд╣рддреА рд╣реИред

AcJacopoBonta рдХреНрдпрд╛ рдЖрдк esakal рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@JacopoBonta рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк awesome-typescript-loader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдиреНрдп рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдПрдХ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рддреЛ рдореИрдВрдиреЗ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд┐рдпрд╛ред awesome-typescript-loader рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:

/* tsconfig.json */
{
  "compilerOptions": { },
  "awesomeTypescriptLoaderOptions": {
    "ignoreDiagnostics": [7005]
  }
}

рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛

рд╣рд╛рдБ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред

рд╡реИрд╕реЗ рднреА, рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рд╣реИ рдФрд░ рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ ЁЯОЙ

рдзрдиреНрдпрд╡рд╛рдж @esakal рдЖрдк рд╕рдорд╛рдзрд╛рди рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ (рдореЗрд░реЗ рд▓рд┐рдП) рд╣реИред рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП transpileOnly: true рд╕реЗрдЯ рдХрд░рддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЙрд╕ рдУрдПрдлрд╕реА рдХрд╛ рдкреНрд░рднрд╛рд╡ рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛рдиреЗ рджреЗрдиреЗ рдХрд╛ рдерд╛ред

рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди, рдмрд╣реБрдд рдХрдо рд╡рд┐рдиреНрдпрд╛рд╕ ( presets.js ) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

const path = require("path");

module.exports = [
    {
        name: "@storybook/preset-typescript",
        options: {
            tsLoaderOptions: {
                configFile: path.resolve(__dirname, "../tsconfig.json"),
                ignoreDiagnostics: [7005],
            },
        },
    },
    {
        name: "@storybook/addon-docs/preset",
        options: {
            configureJSX: true,
        },
    },
];

рд╢реБрдХреНрд░рд┐рдпрд╛!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

arunoda picture arunoda  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

purplecones picture purplecones  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

oriSomething picture oriSomething  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dnlsandiego picture dnlsandiego  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shilman picture shilman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ