From e29d0e758a782228ad59687155245c64d2e75f17 Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Sun, 11 Feb 2018 15:00:35 +0000 Subject: [PATCH 1/6] Add moduleMetdata decorator for supplying common Angular metadata --- app/angular/index.d.ts | 1 + app/angular/src/client/index.js | 2 + .../client/preview/angular/decorators.test.ts | 42 +++++++++++++++ .../src/client/preview/angular/decorators.ts | 6 +++ docs/src/pages/basics/guide-angular/index.md | 52 +++++++++++++++++++ .../src/stories/custom-metadata.stories.ts | 22 ++++---- scripts/test.js | 2 +- 7 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 app/angular/src/client/preview/angular/decorators.test.ts create mode 100644 app/angular/src/client/preview/angular/decorators.ts diff --git a/app/angular/index.d.ts b/app/angular/index.d.ts index 09fc1b7c611f..1e067cc761f3 100644 --- a/app/angular/index.d.ts +++ b/app/angular/index.d.ts @@ -1,4 +1,5 @@ import { NgModuleMetadata, ICollection } from './dist/client/preview/angular/types'; +export { moduleMetadata } from './dist/client/preview/angular/decorators'; export interface IStorybookStory { name: string; diff --git a/app/angular/src/client/index.js b/app/angular/src/client/index.js index 925ffed29bb3..e2e3fc59d028 100644 --- a/app/angular/src/client/index.js +++ b/app/angular/src/client/index.js @@ -1 +1,3 @@ export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview'; + +export { moduleMetadata } from './preview/angular/decorators'; diff --git a/app/angular/src/client/preview/angular/decorators.test.ts b/app/angular/src/client/preview/angular/decorators.test.ts new file mode 100644 index 000000000000..cfe4fdf4a962 --- /dev/null +++ b/app/angular/src/client/preview/angular/decorators.test.ts @@ -0,0 +1,42 @@ +import { moduleMetadata } from './decorators'; + +class MockModule {} +class MockService {} +class MockComponent {} + +describe('moduleMetadata', () => { + it('should add metadata to a story without it', () => { + const result = moduleMetadata({ + imports: [MockModule], + providers: [MockService], + })(() => ({ + component: MockComponent, + })); + + expect(result).toEqual({ + component: MockComponent, + moduleMetadata: { + imports: [MockModule], + providers: [MockService], + }, + }); + }); + + it('should not override individual metadata on a story', () => { + const result = moduleMetadata({ + imports: [MockModule], + })(() => ({ + component: MockComponent, + moduleMetadata: { + providers: MockService, + }, + })); + + expect(result).toEqual({ + component: MockComponent, + moduleMetadata: { + providers: MockService, + }, + }); + }); +}); diff --git a/app/angular/src/client/preview/angular/decorators.ts b/app/angular/src/client/preview/angular/decorators.ts new file mode 100644 index 000000000000..55ae4a8f8ab9 --- /dev/null +++ b/app/angular/src/client/preview/angular/decorators.ts @@ -0,0 +1,6 @@ +import { NgModuleMetadata } from './types'; + +export const moduleMetadata = (metadata: Partial) => (context: () => any) => ({ + moduleMetadata: metadata, + ...context(), +}); diff --git a/docs/src/pages/basics/guide-angular/index.md b/docs/src/pages/basics/guide-angular/index.md index 8592774aca4e..73a7f86194dd 100644 --- a/docs/src/pages/basics/guide-angular/index.md +++ b/docs/src/pages/basics/guide-angular/index.md @@ -113,3 +113,55 @@ npm run storybook Now you can change components and write stories whenever you need to. You'll get those changes into Storybook in a snap with the help of webpack's HMR API. + +## Module Metadata + +If your component has dependencies on other Angular directives and modules, these can be supplied using the `moduleMetadata` property on an individual story: + +```js +import { CommonModule } from '@angular/common'; +import { storiesOf } from '@storybook/angular'; +import { MyButtonComponent } from '../src/app/my-button/my-button.component'; +import { MyPanelComponent } from '../src/app/my-panel/my-panel.component'; +import { MyDataService } from '../src/app/my-data/my-data.service'; + +storiesOf('My Panel', module) + .add('Default', () => ({ + component: MyPanelComponent, + moduleMetadata: { + imports: [CommonModule], + schemas: [], + declarations: [MyButtonComponent], + providers: [MyDataService], + } + })); +``` + +If you have metadata that is common between your stories, this can configured once using the `moduleMetadata()` decorator: + +```js +import { CommonModule } from '@angular/common'; +import { storiesOf, moduleMetadata } from '@storybook/angular'; +import { MyButtonComponent } from '../src/app/my-button/my-button.component'; +import { MyPanelComponent } from '../src/app/my-panel/my-panel.component'; +import { MyDataService } from '../src/app/my-data/my-data.service'; + +storiesOf('My Panel', module) + .addDecorator( + moduleMetadata({ + imports: [CommonModule], + schemas: [], + declarations: [MyButtonComponent], + providers: [MyDataService], + }) + ) + .add('Default', () => ({ + component: MyPanelComponent + })) + .add('with a title', () => ({ + component: MyPanelComponent, + props: { + title: 'Foo', + } + })); +``` diff --git a/examples/angular-cli/src/stories/custom-metadata.stories.ts b/examples/angular-cli/src/stories/custom-metadata.stories.ts index 48c03a3ed644..92c33226f6c8 100644 --- a/examples/angular-cli/src/stories/custom-metadata.stories.ts +++ b/examples/angular-cli/src/stories/custom-metadata.stories.ts @@ -1,4 +1,4 @@ -import { storiesOf } from '@storybook/angular'; +import { storiesOf, moduleMetadata } from '@storybook/angular'; import { withKnobs, text } from '@storybook/addon-knobs/angular'; import { NameComponent } from './moduleMetadata/name.component'; @@ -35,16 +35,18 @@ storiesOf('Custom Pipe/With Knobs', module) })); storiesOf('Custom ngModule metadata', module) - .add('simple', () => ({ - component: ServiceComponent, - props: { - name: 'Static name', - }, - moduleMetadata: { + .addDecorator( + moduleMetadata({ imports: [], schemas: [], declarations: [], providers: [DummyService], + }) + ) + .add('simple', () => ({ + component: ServiceComponent, + props: { + name: 'Static name', }, })) .addDecorator(withKnobs) @@ -56,11 +58,5 @@ storiesOf('Custom ngModule metadata', module) props: { name, }, - moduleMetadata: { - imports: [], - schemas: [], - declarations: [], - providers: [DummyService], - }, }; }); diff --git a/scripts/test.js b/scripts/test.js index 40d6ff255ae2..28c89f8b39c3 100755 --- a/scripts/test.js +++ b/scripts/test.js @@ -43,7 +43,7 @@ const createOption = ({ defaultValue, option, name, extraParam }) => ({ const tasks = { core: createProject({ - name: `Core & React & Vue & Polymer ${chalk.gray('(core)')}`, + name: `Core & React & Vue & Polymer & Angular ${chalk.gray('(core)')}`, defaultValue: true, option: '--core', projectLocation: path.join(__dirname, '..'), From d2bbf3a430bf8ccdc2b0703ff2351439a2fb69bc Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Tue, 13 Feb 2018 21:10:22 +0000 Subject: [PATCH 2/6] Combine rather than replace and add examples --- .../client/preview/angular/decorators.test.ts | 35 +++++- .../src/client/preview/angular/decorators.ts | 23 +++- .../custom-metadata.stories.storyshot | 102 ++++++++++++++++++ .../src/stories/custom-metadata.stories.ts | 57 ++++++++-- 4 files changed, 202 insertions(+), 15 deletions(-) diff --git a/app/angular/src/client/preview/angular/decorators.test.ts b/app/angular/src/client/preview/angular/decorators.test.ts index cfe4fdf4a962..80bf68dd5acd 100644 --- a/app/angular/src/client/preview/angular/decorators.test.ts +++ b/app/angular/src/client/preview/angular/decorators.test.ts @@ -1,6 +1,7 @@ import { moduleMetadata } from './decorators'; class MockModule {} +class MockModuleTwo {} class MockService {} class MockComponent {} @@ -16,26 +17,54 @@ describe('moduleMetadata', () => { expect(result).toEqual({ component: MockComponent, moduleMetadata: { + declarations: [], + entryComponents: [], imports: [MockModule], + schemas: [], providers: [MockService], }, }); }); - it('should not override individual metadata on a story', () => { + it('should combine with individual metadata on a story', () => { const result = moduleMetadata({ imports: [MockModule], })(() => ({ component: MockComponent, moduleMetadata: { - providers: MockService, + imports: [MockModuleTwo], + providers: [MockService], + }, + })); + + expect(result).toEqual({ + component: MockComponent, + moduleMetadata: { + declarations: [], + entryComponents: [], + imports: [MockModule, MockModuleTwo], + schemas: [], + providers: [MockService], + }, + }); + }); + + it('should return the original metadata if passed null', () => { + const result = moduleMetadata(null)(() => ({ + component: MockComponent, + moduleMetadata: { + providers: [MockService], }, })); expect(result).toEqual({ component: MockComponent, moduleMetadata: { - providers: MockService, + declarations: [], + entryComponents: [], + imports: [], + schemas: [], + providers: [MockService], }, }); }); diff --git a/app/angular/src/client/preview/angular/decorators.ts b/app/angular/src/client/preview/angular/decorators.ts index 55ae4a8f8ab9..7897d6f0c380 100644 --- a/app/angular/src/client/preview/angular/decorators.ts +++ b/app/angular/src/client/preview/angular/decorators.ts @@ -1,6 +1,21 @@ import { NgModuleMetadata } from './types'; -export const moduleMetadata = (metadata: Partial) => (context: () => any) => ({ - moduleMetadata: metadata, - ...context(), -}); +export const moduleMetadata = (metadata: Partial) => (storyFn: () => any) => { + const story = storyFn(); + const storyMetadata = story.moduleMetadata || {}; + metadata = metadata || {}; + + return { + ...story, + moduleMetadata: { + declarations: [...(metadata.declarations || []), ...(storyMetadata.declarations || [])], + entryComponents: [ + ...(metadata.entryComponents || []), + ...(storyMetadata.entryComponents || []), + ], + imports: [...(metadata.imports || []), ...(storyMetadata.imports || [])], + schemas: [...(metadata.schemas || []), ...(storyMetadata.schemas || [])], + providers: [...(metadata.providers || []), ...(storyMetadata.providers || [])], + }, + }; +}; diff --git a/examples/angular-cli/src/stories/__snapshots__/custom-metadata.stories.storyshot b/examples/angular-cli/src/stories/__snapshots__/custom-metadata.stories.storyshot index d927a530a22b..8105237585b4 100644 --- a/examples/angular-cli/src/stories/__snapshots__/custom-metadata.stories.storyshot +++ b/examples/angular-cli/src/stories/__snapshots__/custom-metadata.stories.storyshot @@ -1,5 +1,107 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Storyshots Common ngModule metadata simple 1`] = ` + + + + +

+ Static name: +

+ + +
    + + + + + +
+ + +
+
+`; + +exports[`Storyshots Common ngModule metadata template 1`] = ` + + + + + +

+ Static name: +

+ + +
    + + + + + +
+ + +
+
+
+`; + +exports[`Storyshots Common ngModule metadata with knobs 1`] = ` + + + + + +

+ CustomPipe: foobar +

+
+ + + + + +

+ Static name: +

+ + +
    + + + + + +
+ + +
+ + +
+
+`; + exports[`Storyshots Custom Pipe Default 1`] = ` ({ component: ServiceComponent, props: { name: 'Static name', }, + moduleMetadata: { + imports: [], + schemas: [], + declarations: [], + providers: [DummyService], + }, })) .addDecorator(withKnobs) .add('with knobs', () => { @@ -58,5 +56,48 @@ storiesOf('Custom ngModule metadata', module) props: { name, }, + moduleMetadata: { + imports: [], + schemas: [], + declarations: [], + providers: [DummyService], + }, }; }); + +storiesOf('Common ngModule metadata', module) + .addDecorator( + moduleMetadata({ + imports: [], + schemas: [], + declarations: [ServiceComponent], + providers: [DummyService], + }) + ) + .add('simple', () => ({ + component: ServiceComponent, + props: { + name: 'Static name', + }, + })) + .add('template', () => ({ + template: + '', + props: { + name: 'Static name', + }, + })) + .addDecorator(withKnobs) + .add('with knobs', () => ({ + template: ` + + + `, + props: { + field: text('field', 'foobar'), + name: 'Static name', + }, + moduleMetadata: { + declarations: [NameComponent, CustomPipePipe], + }, + })); From 1ee3e0afc81234815815c6be3937a7500ae0923e Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Sat, 17 Feb 2018 23:19:58 +0000 Subject: [PATCH 3/6] Add test for global decorator usage --- app/angular/index.d.ts | 1 + app/angular/src/client/index.js | 9 +++++- .../client/preview/angular/decorators.test.ts | 28 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/angular/index.d.ts b/app/angular/index.d.ts index 1e067cc761f3..3db9de674abd 100644 --- a/app/angular/index.d.ts +++ b/app/angular/index.d.ts @@ -30,4 +30,5 @@ declare module '@storybook/angular' { export function addDecorator(decorator: any): IApi; export function configure(loaders: () => NodeRequire, module: NodeModule): void; export function getStorybook(): IStoribookSection[]; + export function clearDecorators(): void; } diff --git a/app/angular/src/client/index.js b/app/angular/src/client/index.js index e2e3fc59d028..2b82749a15f5 100644 --- a/app/angular/src/client/index.js +++ b/app/angular/src/client/index.js @@ -1,3 +1,10 @@ -export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview'; +export { + storiesOf, + setAddon, + addDecorator, + configure, + getStorybook, + clearDecorators, +} from './preview'; export { moduleMetadata } from './preview/angular/decorators'; diff --git a/app/angular/src/client/preview/angular/decorators.test.ts b/app/angular/src/client/preview/angular/decorators.test.ts index 80bf68dd5acd..cab641cfec8b 100644 --- a/app/angular/src/client/preview/angular/decorators.test.ts +++ b/app/angular/src/client/preview/angular/decorators.test.ts @@ -1,4 +1,5 @@ import { moduleMetadata } from './decorators'; +import { addDecorator, storiesOf, clearDecorators, getStorybook } from '@storybook/angular'; class MockModule {} class MockModuleTwo {} @@ -68,4 +69,31 @@ describe('moduleMetadata', () => { }, }); }); + + it('should work when added globally', () => { + const metadata = { + declarations: [MockComponent], + providers: [MockService], + entryComponents: [MockComponent], + imports: [MockModule], + }; + + addDecorator(moduleMetadata(metadata)); + + storiesOf('Test', module).add('Default', () => ({ + component: MockComponent, + })); + + const [storybook] = getStorybook(); + + expect(storybook.stories[0].render().moduleMetadata).toEqual({ + declarations: [MockComponent], + providers: [MockService], + entryComponents: [MockComponent], + imports: [MockModule], + schemas: [], + }); + + clearDecorators(); + }); }); From 246fc20705106ee31cd7d97ded43ce32ec77543c Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Sun, 18 Feb 2018 08:50:32 +0000 Subject: [PATCH 4/6] Remove top level export of clearDecorators --- app/angular/index.d.ts | 1 - app/angular/src/client/index.js | 9 +-------- .../src/client/preview/angular/decorators.test.ts | 2 +- app/angular/src/client/preview/index.d.ts | 6 ++++++ 4 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 app/angular/src/client/preview/index.d.ts diff --git a/app/angular/index.d.ts b/app/angular/index.d.ts index 3db9de674abd..1e067cc761f3 100644 --- a/app/angular/index.d.ts +++ b/app/angular/index.d.ts @@ -30,5 +30,4 @@ declare module '@storybook/angular' { export function addDecorator(decorator: any): IApi; export function configure(loaders: () => NodeRequire, module: NodeModule): void; export function getStorybook(): IStoribookSection[]; - export function clearDecorators(): void; } diff --git a/app/angular/src/client/index.js b/app/angular/src/client/index.js index 2b82749a15f5..e2e3fc59d028 100644 --- a/app/angular/src/client/index.js +++ b/app/angular/src/client/index.js @@ -1,10 +1,3 @@ -export { - storiesOf, - setAddon, - addDecorator, - configure, - getStorybook, - clearDecorators, -} from './preview'; +export { storiesOf, setAddon, addDecorator, configure, getStorybook } from './preview'; export { moduleMetadata } from './preview/angular/decorators'; diff --git a/app/angular/src/client/preview/angular/decorators.test.ts b/app/angular/src/client/preview/angular/decorators.test.ts index cab641cfec8b..2fa5b8d7ac06 100644 --- a/app/angular/src/client/preview/angular/decorators.test.ts +++ b/app/angular/src/client/preview/angular/decorators.test.ts @@ -1,5 +1,5 @@ import { moduleMetadata } from './decorators'; -import { addDecorator, storiesOf, clearDecorators, getStorybook } from '@storybook/angular'; +import { addDecorator, storiesOf, clearDecorators, getStorybook } from '..'; class MockModule {} class MockModuleTwo {} diff --git a/app/angular/src/client/preview/index.d.ts b/app/angular/src/client/preview/index.d.ts new file mode 100644 index 000000000000..ef89ba61ed6a --- /dev/null +++ b/app/angular/src/client/preview/index.d.ts @@ -0,0 +1,6 @@ +export function storiesOf(kind: string, module: NodeModule): IApi; +export function setAddon(addon: any): void; +export function addDecorator(decorator: any): IApi; +export function configure(loaders: () => NodeRequire, module: NodeModule): void; +export function getStorybook(): IStoribookSection[]; +export function clearDecorators(): void; From 76ebe436620ab01fb265dd4e102471ee36d01c11 Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Sun, 18 Feb 2018 10:28:54 +0000 Subject: [PATCH 5/6] Add metadata example stories --- .../metadata-combined.stories.storyshot | 93 +++++++++++++++++++ .../metadata-individual.stories.storyshot | 57 ++++++++++++ .../metadata-shared.stories.storyshot | 91 ++++++++++++++++++ .../src/stories/custom-pipes.stories.ts | 21 ++--- .../src/stories/custom-providers.stories.ts | 21 ++--- .../src/stories/custom-styles.stories.ts | 13 ++- examples/angular-cli/src/stories/index.ts | 12 +-- .../src/stories/metadata-combined.stories.ts | 36 +++++++ .../stories/metadata-individual.stories.ts | 37 ++++++++ .../src/stories/metadata-shared.stories.ts | 29 ++++++ .../stories/moduleMetadata/token.component.ts | 31 +++++++ 11 files changed, 404 insertions(+), 37 deletions(-) create mode 100644 examples/angular-cli/src/stories/__snapshots__/metadata-combined.stories.storyshot create mode 100644 examples/angular-cli/src/stories/__snapshots__/metadata-individual.stories.storyshot create mode 100644 examples/angular-cli/src/stories/__snapshots__/metadata-shared.stories.storyshot create mode 100644 examples/angular-cli/src/stories/metadata-combined.stories.ts create mode 100644 examples/angular-cli/src/stories/metadata-individual.stories.ts create mode 100644 examples/angular-cli/src/stories/metadata-shared.stories.ts create mode 100644 examples/angular-cli/src/stories/moduleMetadata/token.component.ts diff --git a/examples/angular-cli/src/stories/__snapshots__/metadata-combined.stories.storyshot b/examples/angular-cli/src/stories/__snapshots__/metadata-combined.stories.storyshot new file mode 100644 index 000000000000..d7c93c72db25 --- /dev/null +++ b/examples/angular-cli/src/stories/__snapshots__/metadata-combined.stories.storyshot @@ -0,0 +1,93 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots Metadata|Combined Combined 1 1`] = ` + + + + + +

+ Prop Name +

+ + +

+ Items: +

+ + +
    + + + +
  • + + Joe + +
  • +
  • + + Jane + +
  • + + +
+ + +
+
+
+`; + +exports[`Storyshots Metadata|Combined Combined 2 1`] = ` + + + + + +

+ CustomPipe: Prop Name +

+ + +

+ Items: +

+ + +
    + + + +
  • + + Joe + +
  • +
  • + + Jane + +
  • + + +
+ + +
+
+
+`; diff --git a/examples/angular-cli/src/stories/__snapshots__/metadata-individual.stories.storyshot b/examples/angular-cli/src/stories/__snapshots__/metadata-individual.stories.storyshot new file mode 100644 index 000000000000..3f4b1d5b133d --- /dev/null +++ b/examples/angular-cli/src/stories/__snapshots__/metadata-individual.stories.storyshot @@ -0,0 +1,57 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots Metadata|Individual Individual 1 1`] = ` + + + + + +`; + +exports[`Storyshots Metadata|Individual Individual 2 1`] = ` + + + + + +

+ Provider Name +

+ + +

+ Items: +

+ + +
    + + + +
  • + + Jim + +
  • +
  • + + Jill + +
  • + + +
+ + +
+
+
+`; diff --git a/examples/angular-cli/src/stories/__snapshots__/metadata-shared.stories.storyshot b/examples/angular-cli/src/stories/__snapshots__/metadata-shared.stories.storyshot new file mode 100644 index 000000000000..06342cd5f760 --- /dev/null +++ b/examples/angular-cli/src/stories/__snapshots__/metadata-shared.stories.storyshot @@ -0,0 +1,91 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots Metadata|Shared Shared 1 1`] = ` + + + + + +

+ Prop Name +

+ + +

+ Items: +

+ + +
    + + + +
  • + + Joe + +
  • +
  • + + Jane + +
  • + + +
+ + +
+
+
+`; + +exports[`Storyshots Metadata|Shared Shared 2 1`] = ` + + + + + +

+ Provider Name +

+ + +

+ Items: +

+ + +
    + + + +
  • + + Joe + +
  • +
  • + + Jane + +
  • + + +
+ + +
+
+
+`; diff --git a/examples/angular-cli/src/stories/custom-pipes.stories.ts b/examples/angular-cli/src/stories/custom-pipes.stories.ts index 45b84c68ff0e..b8512cd6a525 100644 --- a/examples/angular-cli/src/stories/custom-pipes.stories.ts +++ b/examples/angular-cli/src/stories/custom-pipes.stories.ts @@ -3,18 +3,21 @@ import { withKnobs, text } from '@storybook/addon-knobs/angular'; import { NameComponent } from './moduleMetadata/name.component'; import { CustomPipePipe } from './moduleMetadata/custom.pipe'; +import { moduleMetadata } from '@storybook/angular'; storiesOf('Custom|Pipes', module) - .add('Simple', () => ({ - component: NameComponent, - props: { - field: 'foobar', - }, - moduleMetadata: { + .addDecorator( + moduleMetadata({ imports: [], schemas: [], declarations: [CustomPipePipe], providers: [], + }) + ) + .add('Simple', () => ({ + component: NameComponent, + props: { + field: 'foobar', }, })) .addDecorator(withKnobs) @@ -23,10 +26,4 @@ storiesOf('Custom|Pipes', module) props: { field: text('field', 'foobar'), }, - moduleMetadata: { - imports: [], - schemas: [], - declarations: [CustomPipePipe], - providers: [], - }, })); diff --git a/examples/angular-cli/src/stories/custom-providers.stories.ts b/examples/angular-cli/src/stories/custom-providers.stories.ts index 420c2f1c64a2..6101990a35a1 100644 --- a/examples/angular-cli/src/stories/custom-providers.stories.ts +++ b/examples/angular-cli/src/stories/custom-providers.stories.ts @@ -3,18 +3,21 @@ import { withKnobs, text } from '@storybook/addon-knobs/angular'; import { DummyService } from './moduleMetadata/dummy.service'; import { ServiceComponent } from './moduleMetadata/service.component'; +import { moduleMetadata } from '@storybook/angular'; storiesOf('Custom|Providers', module) - .add('Simple', () => ({ - component: ServiceComponent, - props: { - name: 'Static name', - }, - moduleMetadata: { + .addDecorator( + moduleMetadata({ imports: [], schemas: [], declarations: [], providers: [DummyService], + }) + ) + .add('Simple', () => ({ + component: ServiceComponent, + props: { + name: 'Static name', }, })) .addDecorator(withKnobs) @@ -26,11 +29,5 @@ storiesOf('Custom|Providers', module) props: { name, }, - moduleMetadata: { - imports: [], - schemas: [], - declarations: [], - providers: [DummyService], - }, }; }); diff --git a/examples/angular-cli/src/stories/custom-styles.stories.ts b/examples/angular-cli/src/stories/custom-styles.stories.ts index 6d8cabd8f2df..611b7667280f 100644 --- a/examples/angular-cli/src/stories/custom-styles.stories.ts +++ b/examples/angular-cli/src/stories/custom-styles.stories.ts @@ -1,14 +1,16 @@ -import { storiesOf } from '@storybook/angular'; +import { storiesOf, moduleMetadata } from '@storybook/angular'; import { action } from '@storybook/addon-actions'; import { withKnobs, text } from '@storybook/addon-knobs/angular'; import { Button } from '@storybook/angular/demo'; storiesOf('Custom|Style', module) + .addDecorator( + moduleMetadata({ + declarations: [Button], + }) + ) .add('Default', () => ({ template: ``, - moduleMetadata: { - declarations: [Button], - }, props: { text: 'Button with custom styles', onClick: action('log'), @@ -25,9 +27,6 @@ storiesOf('Custom|Style', module) .addDecorator(withKnobs) .add('With Knobs', () => ({ template: ``, - moduleMetadata: { - declarations: [Button], - }, props: { text: text('text', 'Button with custom styles'), onClick: action('log'), diff --git a/examples/angular-cli/src/stories/index.ts b/examples/angular-cli/src/stories/index.ts index 625a86f6bc64..785e16620a63 100644 --- a/examples/angular-cli/src/stories/index.ts +++ b/examples/angular-cli/src/stories/index.ts @@ -1,5 +1,6 @@ import { storiesOf } from '@storybook/angular'; import { Welcome, Button } from '@storybook/angular/demo'; +import { moduleMetadata } from '@storybook/angular'; storiesOf('Welcome', module).add('to Storybook', () => ({ template: ``, @@ -10,11 +11,13 @@ storiesOf('Welcome', module).add('to Storybook', () => ({ })); storiesOf('Button', module) + .addDecorator( + moduleMetadata({ + declarations: [Button], + }) + ) .add('with text', () => ({ template: ``, - moduleMetadata: { - declarations: [Button], - }, props: { text: 'Hello Button', onClick: event => { @@ -25,9 +28,6 @@ storiesOf('Button', module) })) .add('with some emoji', () => ({ template: ``, - moduleMetadata: { - declarations: [Button], - }, props: { text: '😀 😎 👍 💯', onClick: () => {}, diff --git a/examples/angular-cli/src/stories/metadata-combined.stories.ts b/examples/angular-cli/src/stories/metadata-combined.stories.ts new file mode 100644 index 000000000000..31c5289378e3 --- /dev/null +++ b/examples/angular-cli/src/stories/metadata-combined.stories.ts @@ -0,0 +1,36 @@ +import { storiesOf, moduleMetadata } from '@storybook/angular'; +import { TokenComponent, ITEMS, DEFAULT_NAME } from './moduleMetadata/token.component'; +import { CustomPipePipe } from './moduleMetadata/custom.pipe'; + +storiesOf('Metadata|Combined', module) + .addDecorator( + moduleMetadata({ + imports: [], + declarations: [TokenComponent], + providers: [ + { + provide: ITEMS, + useValue: ['Joe', 'Jane'], + }, + { + provide: DEFAULT_NAME, + useValue: 'Provider Name', + }, + ], + }) + ) + .add('Combined 1', () => ({ + template: ``, + props: { + name: 'Prop Name', + }, + })) + .add('Combined 2', () => ({ + template: ``, + props: { + name: 'Prop Name', + }, + moduleMetadata: { + declarations: [CustomPipePipe], + }, + })); diff --git a/examples/angular-cli/src/stories/metadata-individual.stories.ts b/examples/angular-cli/src/stories/metadata-individual.stories.ts new file mode 100644 index 000000000000..79b3a5a12b78 --- /dev/null +++ b/examples/angular-cli/src/stories/metadata-individual.stories.ts @@ -0,0 +1,37 @@ +import { storiesOf } from '@storybook/angular'; +import { TokenComponent, ITEMS, DEFAULT_NAME } from './moduleMetadata/token.component'; + +storiesOf('Metadata|Individual', module) + .add('Individual 1', () => ({ + template: ``, + props: { + name: 'Prop Name', + }, + moduleMetadata: { + imports: [], + declarations: [], + providers: [ + { + provide: ITEMS, + useValue: ['Joe', 'Jane'], + }, + ], + }, + })) + .add('Individual 2', () => ({ + template: ``, + moduleMetadata: { + imports: [], + declarations: [TokenComponent], + providers: [ + { + provide: ITEMS, + useValue: ['Jim', 'Jill'], + }, + { + provide: DEFAULT_NAME, + useValue: 'Provider Name', + }, + ], + }, + })); diff --git a/examples/angular-cli/src/stories/metadata-shared.stories.ts b/examples/angular-cli/src/stories/metadata-shared.stories.ts new file mode 100644 index 000000000000..d4b38c3f0052 --- /dev/null +++ b/examples/angular-cli/src/stories/metadata-shared.stories.ts @@ -0,0 +1,29 @@ +import { storiesOf, moduleMetadata } from '@storybook/angular'; +import { TokenComponent, ITEMS, DEFAULT_NAME } from './moduleMetadata/token.component'; + +storiesOf('Metadata|Shared', module) + .addDecorator( + moduleMetadata({ + imports: [], + declarations: [TokenComponent], + providers: [ + { + provide: ITEMS, + useValue: ['Joe', 'Jane'], + }, + { + provide: DEFAULT_NAME, + useValue: 'Provider Name', + }, + ], + }) + ) + .add('Shared 1', () => ({ + template: ``, + props: { + name: 'Prop Name', + }, + })) + .add('Shared 2', () => ({ + template: ``, + })); diff --git a/examples/angular-cli/src/stories/moduleMetadata/token.component.ts b/examples/angular-cli/src/stories/moduleMetadata/token.component.ts new file mode 100644 index 000000000000..4afb457d1624 --- /dev/null +++ b/examples/angular-cli/src/stories/moduleMetadata/token.component.ts @@ -0,0 +1,31 @@ +import { Component, Input, InjectionToken, Inject, Optional } from '@angular/core'; + +export const ITEMS = new InjectionToken('TokenComponent.Items'); +export const DEFAULT_NAME = new InjectionToken('TokenComponent.DefaultName'); + +@Component({ + selector: 'storybook-simple-token-component', + template: ` +

{{ name }}

+

Items:

+
    +
  • + {{ item }} +
  • +
+ `, +}) +export class TokenComponent { + items; + @Input() name; + + constructor( + @Optional() + @Inject(DEFAULT_NAME) + defaultName: string, + @Inject(ITEMS) items: string[] + ) { + this.name = defaultName; + this.items = items; + } +} From 613b4cb83c9f2830312c16445a7dfdd4dc5a14a9 Mon Sep 17 00:00:00 2001 From: Jon Rimmer Date: Mon, 19 Feb 2018 22:52:38 +0000 Subject: [PATCH 6/6] Update Angular integration test screenshot --- .../__image_snapshots__/angular-cli-snap.png | Bin 78871 -> 81909 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integration/__image_snapshots__/angular-cli-snap.png b/integration/__image_snapshots__/angular-cli-snap.png index 06d6b3e5e180d772a8e527b263d9545705934bab..833db5a360ae81c0fce5877d50a36d5c306715bf 100644 GIT binary patch delta 24139 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 CgsaB@ delta 21077 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