diff --git a/types/storybook__preact/index.d.ts b/types/storybook__preact/index.d.ts new file mode 100644 index 0000000000..0917f2cd21 --- /dev/null +++ b/types/storybook__preact/index.d.ts @@ -0,0 +1,46 @@ +// Type definitions for @storybook/preact 5.0 +// Project: https://github.com/storybooks/storybook, https://github.com/storybooks/storybook/tree/master/app/preact +// Definitions by: Keisuke Kan +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.3 +// Created with the help of storybook__react types + +/// + +import * as Preact from 'preact'; + +export type Renderable = Preact.AnyComponent | JSX.Element; +export type RenderFunction = () => Renderable | Renderable[]; + +export interface DecoratorParameters { + [key: string]: any; +} +export type StoryDecorator = (story: RenderFunction, context: { kind: string, story: string }) => Renderable | null; + +export interface Story { + readonly kind: string; + add(storyName: string, callback: RenderFunction, parameters?: DecoratorParameters): this; + addDecorator(decorator: StoryDecorator): this; + addParameters(parameters: DecoratorParameters): this; +} + +export function addDecorator(decorator: StoryDecorator): void; +export function addParameters(parameters: DecoratorParameters): void; +export function clearDecorators(): void; +export function configure(fn: () => void, module: NodeModule): void; +export function setAddon(addon: object): void; +export function storiesOf(name: string, module: NodeModule): Story; +export function storiesOf(name: string, module: NodeModule): Story & T; +export function forceReRender(): void; + +export interface StoryObject { + name: string; + render: RenderFunction; +} + +export interface StoryBucket { + kind: string; + stories: StoryObject[]; +} + +export function getStorybook(): StoryBucket[]; diff --git a/types/storybook__preact/package.json b/types/storybook__preact/package.json new file mode 100644 index 0000000000..b74d0d14dc --- /dev/null +++ b/types/storybook__preact/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "dependencies": { + "preact": "^8.4.2" + } +} diff --git a/types/storybook__preact/storybook__preact-tests.tsx b/types/storybook__preact/storybook__preact-tests.tsx new file mode 100644 index 0000000000..72651611c5 --- /dev/null +++ b/types/storybook__preact/storybook__preact-tests.tsx @@ -0,0 +1,45 @@ +/** @jsx h */ +import { h } from 'preact'; +import { storiesOf, setAddon, addDecorator, addParameters, configure, getStorybook, RenderFunction, Story, forceReRender, DecoratorParameters, clearDecorators } from '@storybook/preact'; + +const Decorator = (story: RenderFunction) =>
{story()}
; +const parameters: DecoratorParameters = { parameter: 'foo' }; + +forceReRender(); + +storiesOf('Welcome', module) + // local addDecorator + .addDecorator(Decorator) + .add('to Storybook', () =>
) + .add('to Storybook as Array', () => [
,
]) + .add('and a story with additional parameters', () =>
, parameters); + +// global addDecorator +addDecorator(Decorator); +addParameters(parameters); +clearDecorators(); + +// setAddon +interface AnyAddon { + addWithSideEffect(this: Story & T, storyName: string, storyFn: RenderFunction): Story & T; +} +const AnyAddon: AnyAddon = { + addWithSideEffect(this: Story & T, storyName: string, storyFn: RenderFunction): Story & T { + console.log(this.kind === 'withAnyAddon'); + return this.add(storyName, storyFn); + } +}; +setAddon(AnyAddon); +storiesOf('withAnyAddon', module) + .addWithSideEffect('custom story', () =>
) + .addWithSideEffect('more', () =>
) + .add('another story', () =>
) + .add('to Storybook as Array', () => [
,
]) + .add('and a story with additional parameters', () =>
, parameters) + .addWithSideEffect('even more', () =>
); + +// configure +configure(() => undefined, module); + +// getStorybook +getStorybook().forEach(({ kind, stories }) => stories.forEach(({ name, render }) => render())); diff --git a/types/storybook__preact/tsconfig.json b/types/storybook__preact/tsconfig.json new file mode 100644 index 0000000000..3ded473006 --- /dev/null +++ b/types/storybook__preact/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "dom", + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "jsx": "preserve", + "typeRoots": [ + "../" + ], + "paths": { + "@storybook/preact": [ + "storybook__preact" + ] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "storybook__preact-tests.tsx" + ] +} diff --git a/types/storybook__preact/tslint.json b/types/storybook__preact/tslint.json new file mode 100644 index 0000000000..71ee04c4e1 --- /dev/null +++ b/types/storybook__preact/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + "no-unnecessary-generics": false + } +}