webpack-react-docgen-typescript
Version:
A webpack loader with cache react-docgen-typescript
112 lines (91 loc) • 3.42 kB
Markdown
A webpack loader with cache for react/typescript components for [storybook](https://github.com/storybookjs/storybook)
On the first build (ie `npm run storybook`) the typescript prop tables will be parsed with [react-docgen-typescript](https://github.com/styleguidist/react-docgen-typescript) and saved to a local cache.
All subsequent builds will be significantly faster since the PropTables will be read from chache.
The cache will be invalidated when
* the typescript file is changed
* the loader options are changed
* if the forceRegenerate is set to true
## Installation
```sh
npm i -D webpack-react-docgen-typescript
```
## Usage
### 1. Add Storybook preset to `.storybook/main.js`
```js
module.exports = {
presets: ['webpack-react-docgen-typescript/preset', ...]
...
}
```
or with options:
```
presets: [
{
name: require.resolve('webpack-react-docgen-typescript/preset'),
options: {
fileNameResolver: ({ resourcePath, cacheFolder }) => path.join(cacheFolder, resourcePath.replace(/[^a-z0-9]/gi, '_')),
},
},
```
```
module: {
rules: [
{
test: /\.(ts|tsx)$/,
loader: require.resolve('babel-loader'),
options: {
presets: [['react-app', { flow: false, typescript: true }]],
}
},
{
test: /\.(ts|tsx)$/,
exclude: /\.(story|stories).(ts|tsx)$/,
loader: require.resolve("webpack-react-docgen-typescript"),
options: {
propFilter: {
skipPropsWithoutDoc: true,
skipPropsWithName: ['prop4']
}
}
}
],
}
});
```
* `forceRegenerate?: boolean;`
If true, the cahce files will be regenerated forcefully.
* `fileNameResolver?: (object) => string;`
custom function to generate file names for the parsed typescript files. By default those files are created in your `node_modules/.cache/webpack-react-docgen-typescript` folder. If this custom function returns false, the file will not be parsed for typescript prop tables
* `transformProps?: (props: ComponentDoc[]) => ComponentDoc | ComponentDoc[];`
custom function to transform the prop tables as needed. Will receive the prop tables as an array of length at least 1 and can return the element in the array to use, or the full array of type [ComponentDoc](https://github.com/styleguidist/react-docgen-typescript/blob/868faa6ca1bae1b813632eaa6c15f8d6b18447f8/src/parser.ts#L16).
For example add custom fields:
```
presets: [
{
name: require.resolve('webpack-react-docgen-typescript/preset'),
options: {
transformProps: tables => tables.map(table => ({ ...table, type: 'tsType' }))[0],
},
},
```
```
ParserOptions {
propFilter?: StaticPropFilter | PropFilter;
componentNameResolver?: ComponentNameResolver;
shouldExtractLiteralValuesFromEnum?: boolean;
savePropValueAsString?: boolean;
}
StaticPropFilter {
skipPropsWithName?: string[] | string;
skipPropsWithoutDoc?: boolean;
}
PropFilter = (props: PropItem, component: Component) => boolean;
ComponentNameResolver = (
exp: ts.Symbol,
source: ts.SourceFile
) => string | undefined | null | false;
```