Storybook: Angular 2 ์ง€์›

์— ๋งŒ๋“  2016๋…„ 06์›” 22์ผ  ยท  76์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: storybookjs/storybook

Angular 2 ์ง€์›์ด ๋กœ๋“œ๋งต์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.
๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ทธ ๋ชฉ์ ์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋ ค๋Š” ๊ด€๋ จ ์‹œ๋„๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์•„์ง ์—ฌ๊ธฐ์—์„œ ๊ด€๋ จ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„์ง PoC๋ฅผ ํ†ตํ•ฉํ•˜์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ ์—์„œ ์ฒซ ๋ฒˆ์งธ ์ปค๋ฐ‹์˜ Angular ๋น„ํŠธ๊ฐ€ ์˜๊ฐ์„์ฃผ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ์˜ ์˜ค๋ž˜๋œ ๋ฒ„์ „๋„ ํฌํฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฐœ๋…์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ ์šฉ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

angular feature request help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ˜„์žฌ ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/storybooks/storybook/blob/master/ROADMAP.md#angular

๋ชจ๋“  76 ๋Œ“๊ธ€

ํ•ต์‹ฌ UI๋ฅผ ๋ณ„๋„์˜ ์•ฑ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. NG2์— ์ง์ ‘ ์‚ฌ์šฉํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ : https://github.com/kadirahq/storybook-ui

๋ฉ‹์žˆ๋Š”. ๊ทธ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค! :)

์ด๋ด, @arunoda , ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
ng2 ์ „์šฉ ์Šคํ† ๋ฆฌ ๋ถ UI๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ๋ถ„์ด ๋‹ฌ์„ฑํ•˜๊ณ ์žํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ์„ค๋ช…์„ ์–ป๊ณ  ์ œ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Angular 2 API๋Š” RC5 ์ถœ์‹œ์™€ ํ•จ๊ป˜ ์•ˆ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. cc : @arunoda @mnmtanish

@arunoda : ๋กœ๋“œ๋งต์—์„œ ์ด๊ฒƒ์ด ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ Angular์˜ ๊ฒฝ์šฐ์ด ๋ถ„ํ• ์—์„œ ์•„์ด๋””์–ด๋Š” storybook-ui ์˜ React๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ด๋ก ์  ng2-storybook ์ธํ„ฐํŽ˜์ด์Šค๋Š” Angular ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋žฌ์–ด?

@ tycho01 ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‹ค์†Œ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
Storybook-ui๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ์• ๋“œ์˜จ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Slack์—์„œ ์ €๋ฅผ ํ•‘ํ•˜์„ธ์š”. ๋” ์ด์•ผ๊ธฐํ•ฉ์‹œ๋‹ค.

@ tycho01 , @arunoda ์—ฌ๋Ÿฌ๋ถ„์ด์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

@alterx : ๋‚ด๊ฐ€ ์–ป์€ ํฌ์ธํ„ฐ : storybook-react ๋Š” storybook-ui ์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (iframe ๋‚ด์—์„œ ์‹คํ–‰ ๋จ); ๋‹ค์Œ ๋‹จ๊ณ„๋Š” Angular ๋ฒ„์ „์œผ๋กœ ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹คํ—˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์‹œ๋„ ์ดํ›„๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค -https:

@ tycho01 , ๋‚˜๋Š” ์†Œ์Šค๋ฅผ ํ™•์ธํ–ˆ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธํ™” ๋œ iframe (https://github.com/storybooks/react-storybook/blob/master/src/client/manager/preview.js) ์ธ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฏธ๋ฆฌ๋ณด๊ธฐ iframe์—์„œ ng2 ์Šคํ† ๋ฆฌ๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

react-storybook ๊ธฐ๋ณธ์ ์œผ๋กœ Provider ์ œ๊ณตํ•˜๋Š” storybook-ui ํ•˜๊ณ  ์•ž์„œ ์–ธ๊ธ‰ ํ•œ Preview ๋ Œ๋”๋งํ•˜๊ณ  ์Šคํ† ๋ฆฌ API๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ์ด ๊ณต๊ธ‰์ž์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ renderStorybookUI ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

import renderStorybookUI from '@kadira/storybook-ui';
import Provider from './provider';

const rootEl = document.getElementById('root');
renderStorybookUI(rootEl, new Provider());

๊ทธ ํ›„ storybook-ui ๊ฐ€ ์ œ์–ด๋˜๊ณ  ์ปจํ…์ŠคํŠธ (๊ณต๊ธ‰์ž ํฌํ•จ)๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์•ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (mantra-core์˜ createApp ). ๊ณต๊ธ‰์ž (๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ ์†Œํ’ˆ๊ณผ ํ•จ๊ป˜)๋Š” ui ๋ชจ๋“ˆ (https://github.com/storybooks/storybook-ui/blob/master/src/modules/ui/routes.js)์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. )๋Š” react-storybook ์—์„œ ๋งŒ๋“ค ๋•Œ ์ •์˜ํ•œ renderPreview ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

@arunoda , ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ๋น ์ง„ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”

@amcdnl , ์œ ๋ง ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (ํ™”๋ คํ•˜์ง€ ์•Š๊ณ  ํฐ ๊ทธ๋ฆผ ๋งŒ)

@amcdnl : ์—ฐ๊ฒฐ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํŽธ์ง‘ : ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์–ด๋–ค ๋ฐ๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์„ ์ฐพ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ MikeRyan52 ^^

@alterx ๋„ค. ๋‹น์‹ ์€ 100 % ๋งž์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์Šคํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด React Storybook๊ณผ ์œ ์‚ฌํ•œ API๋ฅผ ๋…ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

angular-storybook ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@arunoda ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ์•ต๊ทค๋Ÿฌ ์Šคํ† ๋ฆฌ ๋ถ์— ๋Œ€ํ•œ URL์ด

@bcowgill afaik ์ด๊ฒƒ์€ ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ @amcdnl์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๋„ ์žˆ์Šต๋‹ˆ๋‹ค-http: //www.angularplayground.it/

ํ˜„์žฌ ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/storybooks/storybook/blob/master/ROADMAP.md#angular

๊ทธ๋ž˜์„œ Vue ์šฉ ์Šคํ† ๋ฆฌ ๋ถ์ด ๊ณง ์ถœ์‹œ ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค ๐ŸŽ‰

์ด๊ฒƒ์€ NG2 ์šฉ ๋ฒ„์ „์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฝค ์ข‹์€ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์ด ์Šค๋ ˆ๋“œ๋ฅผ๋ณด๊ณ  ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์‹คํ˜„ํ•  ์šฉ๊ฐํ•œ ์˜ํ˜ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ๊ฐ€ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @ndelangen์ด๋ผ๋Š” ํŽธ๋ฆฌํ•œ ์ €์žฅ์†Œ URL์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

Storybook์€ ๋‹จ์ผ ์ €์žฅ์†Œ์ด๋ฉฐ ์—ฌ๊ธฐ์— ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ npm์— ๋ณ„๋„๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ vue ์•ฑ์€ ์•„์ง ๋งˆ์Šคํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3 ๊ฐœ์˜ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/storybooks/storybook/tree/release/3.2/app/vue
https://github.com/storybooks/storybook/blob/release/3.2/app/vue/src/client/preview/render.js
https://github.com/storybooks/storybook/blob/release/3.2/app/vue/src/server/config/webpack.config.js#L40

render.js๋Š” ๋Œ€๋ถ€๋ถ„์˜ Vue ํŠน์ • ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ๊ณณ์ด๋ฉฐ ์„œ๋ฒ„ ๋ถ€๋ถ„์—๋Š” ๋‹ค๋ฅธ ์›นํŒฉ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋ณต์ œํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค! ๋‚˜์ค‘์— ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ”ํ•œ ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์„ ์ฐพ์€ ํ›„์—.

์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด

  1. app / vue ์ „์ฒด๋ฅผ app / angular์— ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค (์šฐ๋ฆฌ๋Š” angular2 ์ด์ƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?).
  2. webpack ๊ตฌ์„ฑ์„ ์กฐ์ •ํ•˜์—ฌ ๊ฐ์ง„ ์ฝ”๋“œ๋ฅผ๋กœ๋“œํ•˜๊ณ  ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ render.js๋ฅผ ์กฐ์ •ํ•˜์‹ญ์‹œ์˜ค.
  4. ์• ๋“œ์˜จ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
  5. ๋ฒ„๊ทธ ์ˆ˜์ •
  6. ์ง€๊ธˆ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค
  7. ๋ฌธ์„œ ์ž‘์„ฑ, ์• ๋“œ์˜จ ์ž‘๋™ ๋ชฉ๋ก
  8. ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์ดˆ์•ˆ (๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋งค์ฒด ๊ฐ„ํ–‰๋ฌผ์— ๊ณ„์ • ์ถ”๊ฐ€)
  9. ์ถœ์‹œ ๊ณ„ํš
  10. ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค ์ˆ˜ํ–‰
  11. ๋ฒ„๊ทธ ์ˆ˜์ •
  12. ์‹ค์ œ ์ถœ์‹œ, ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๊ฒŒ์‹œ, ํŠธ์œ— ์•Œ๋ฆผ
  13. ๋” ๋งŽ์€ ๋ฒ„๊ทธ ์ˆ˜์ •
  14. ๋” ๋งŽ์€ ์• ๋“œ์˜จ์— ๋Œ€ํ•œ ์ง€์›์„ ์‹œ๋„ํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

@shilman ์€ ์šฐ๋ฆฌ์˜ ๋ฆด๋ฆฌ์Šค ๋งˆ์Šคํ„ฐ ์…ฐํ”„์ž…๋‹ˆ๋‹ค ๐Ÿ‘จโ€๐Ÿณ

slack์—์„œ ์šฐ๋ฆฌ์™€ ํ•จ๊ป˜ ์ข€ ๋” ๋น ๋ฅธ ์ฑ„ํŒ… ๊ฒฝํ—˜์„ ์–ป์œผ๋ ค๋ฉด github ๐Ÿ’ฌ

https://storybooks-slackin.herokuapp.com

์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค, @ndelangen!
์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  Slack ์ฑ„๋„์— ๊ฐ€์ž…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. : D

@alterx ์ง€๊ธˆ ์ž‘์—… ์ค‘์ž…๋‹ˆ๊นŒ? ์ง€๊ธˆ vue.js ๋ฒ„์ „์„ ๋ณต์ œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ Jordan-Hall, ๊ธฐ๋ณธ ์•ฑ์ด ์ž‘๋™ํ•˜๋Š” PR์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.
# 1474๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค
ํ˜„์žฌ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์ƒ์ž์—์„œ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ˜‘๋ ฅ ํ•  ์ˆ˜ ์žˆ๋„๋ก Slack ์ฑ„๋„์— ์ฐธ์—ฌํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@alterx ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. https://storybooks-slackin.herokuapp.com ์ฑ„๋„์ด ๋‹ค์šด ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ—‰, ๊ทธ๊ฑฐ ๋งž์•„์š” ๐Ÿค”
@ndelangen ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹น๋ถ„๊ฐ„ ๋‚ด PR์€ ๊ธฐ๋ณธ ์ž‘์—… (๊ตฌ์„ฑ ์š”์†Œ ๋ Œ๋”๋ง, ์ž…๋ ฅ ์ „์†ก)์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด vue ๋ฐ react ํ•œ ๊ฒƒ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด์ง€๋งŒ angular ์˜ ์ž‘์—… ๋ฐฉ์‹ ( NgModules )์—๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

3.3 ๋ฆด๋ฆฌ์Šค์˜ ์ผ๋ถ€๋กœ Angular (2+) ์ง€์›์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ heroku๋Š” ์•ฑ์„ ์ข…๋ฃŒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— now.sh์— ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.
https://now-examples-slackin-nqnzoygycp.now.sh/

ยฏ\_(ใƒ„)_/ยฏ

์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํ”„๋กœ์ ํŠธ xD์— gitter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Hey Guys๋Š” ์•„์ง์ด ์ž‘์—…์— ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌ์ค‘์ธ ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ๋‚˜์š”?

์˜ˆ, ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
https://github.com/storybooks/storybook/pull/1474

๋„ค, ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋ณ€๊ฒฝ ํ•œ ์‚ฌํ•ญ์„ ์ œ์ถœํ•˜๋ ค๋ฉด ์˜ค๋Š˜ ์‹œ๊ฐ„์„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ ์‹ฌ ์‹œ๊ฐ„์— ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜„

๋ณ‘ํ•ฉ์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!
npm i -g @storybook/[email protected] ์„ (๋ฅผ) ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ”Œ๋ ˆ์ดํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ์ˆ˜๋™ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

@shilman @alterx ์•ต๊ทค๋Ÿฌ ์•ฑ์œผ๋กœ ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๋งŒ๋“ค์–ด ์กŒ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
์•„์ง ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

1์„ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ? @tomatosource ์—ฌ๊ธฐ์— ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๊บผ์ด ๐Ÿ™‡

@shilman ์ด Angular slack ์ฑ„๋„์—์„œ "๋‹ค์Œ ๋ฉฐ์น  ์•ˆ์—"๋ฆด๋ฆฌ์Šคํ•˜๊ณ  ์‹ถ๋‹ค๊ณ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ๋ฆด๋ฆฌ์Šค๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? :-)

@Hypnosphi ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•ฉ๋‹ˆ๊นŒ? ์ง€์›๋˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. (์ฝ”๋“œ : UNDETECTED)

@aaronksaunders CLI๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋„๋ก ๊ณต์œ  ํ•  ์ˆ˜์žˆ๋Š” ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ „์ฒด ์„ค์ •์ด ํฌํ•จ ๋œ ์˜ˆ์ œ ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/storybooks/storybook/tree/release/3.3/examples/angular-cli

@alterx @tomatosource ์ถœ์‹œ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ์— ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค !

์–ด๋–ค ๋ฒ„์ „์˜ ๊ฐ๋„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

@Insayt @ LTiger14 @MTariqAziz @MathieuFouillet @Quramy @RemiAWE @VadimDez @aitboudad @bermanboris @cheapsteak @ ๊ธฐ๋…๊ต - bromann @diagramatics @dlcardozo @ elad-morphisec @jbueza @johannesjo @jshthornton @ justinlee0777 @mixn @ npatta01 @qrrock @realappie @ruedap @ ์ž‘์€ ๋Œ„์„œ @ tycho01 @ priley86

Angular2 + ์ง€์›์€ @alterx์˜ ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ ๋•๋ถ„์— ์•ŒํŒŒ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค (์ •ํ™•ํžˆ 3.3.0-alpha.4 ). ์ถœ์‹œ ์ค€๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ…Œ์ŠคํŠธ๋ฅผ ๋„์™€์ฃผ์„ธ์š”!

๋‹จ ๋ช‡ ๋ถ„ ๋งŒ์— ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

cd my-angular-project
yarn add @storybook/cli<strong i="33">@alpha</strong>
yarn getstorybook
yarn storybook
open http://localhost:6006

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ examples/angular-cli ์Šคํ† ๋ฆฌ ๋ถ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ฑฐ ๋œ ๋ฒ„์ „์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

storybook

๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”. ๋˜ํ•œ Storybook Slack #angular ์ฑ„๋„ ์—์„œ ์‹ค์‹œ๊ฐ„ ๋„์›€์„๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@shilman์ด yarn getstorybook ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

(function (exports, require, module, __filename, __dirname) { import updateNotifier from 'update-notifier';
                                                              ^^^^^^
SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)

node_modules/@storybook/cli/bin/index.js:1 ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

require("babel-register")({
  ignore: /node_modules\/(?!@storybook)/
});

์ด์ƒํ•˜๊ฒŒ๋„ ์‹ค์ œ๋กœ cli@alpha ์—์„œ babel-register๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@aitboudad ์–ด๋–ค ๋…ธ๋“œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์–ด๋–ค ๋…ธ๋“œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ?

v8.9.0, ๋…ธ๋“œ ๋ฒ„์ „๊ณผ ๊ด€๋ จ์ด ์—†์ง€๋งŒ node_modules ์—์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ํŠธ๋žœ์Šค ํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐ”๋ฒจ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@shilman ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š”

odule build failed: Error: Typescript emitted no output for node_modules/@storybook/angular/dist/client/preview/angular/app.token.ts.

/node_modules/@storybook/angular/dist/server/config/webpack.config.js ์—์„œ transpileOnly ๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ

{
  test: /\.ts?$/,
  use: [
    {
      loader: 'ts-loader',
      options: {
        transpileOnly: true
      }
    },
    { loader: 'angular2-template-loader' }
  ]
}

๋ˆ„๋ฝ ๋œ ๊ธฐ๋Šฅ :

์‚ฌ์šฉ์ž ์ •์˜ NgModule :
ํ˜„์žฌ๋กœ์„œ๋Š” ํ˜„์žฌ ๊ตฌํ˜„์„ ๋งค์šฐ ์ œํ•œ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ NgModule ์„ ์ „๋‹ฌํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

node_modules ์—์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์˜ ํŠธ๋žœ์Šค ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐ”๋ฒจ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@aitboudad ๋””๋ฒ„๊น… @Hypnosphi ๊ฐ€ CLI ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ณ  ๋ฐฉ๊ธˆ ๋ฆด๋ฆฌ์Šคํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณง ๊ฐ๋„ ์ˆ˜์ •์„ ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

https://github.com/storybooks/storybook/releases/tag/v3.3.0-alpha.4

@aitboudad , ์šฐ๋ฆฌ๋Š” ๋ˆ„๋ฝ ๋œ ๊ธฐ๋Šฅ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ์ด๋ฅผ ๋ณด์™„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • NgModules์˜ ๋ฌธ์ œ๋Š” ํ˜„์žฌ ๊ตฌํ˜„์—์„œ ๋ชจ๋“ˆ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ณ  ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž์™€ ์Šคํ‚ค๋งˆ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ์— ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ๋ชจ๋“ˆ์ด ์ž ์žฌ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ๋ชจ๋“ˆ์„ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ญ”๊ฐ€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชฐ๋ผ์š”.

๋˜ํ•œ transpile ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์œ ํ˜• ๊ฒ€์‚ฌ์—†์ด ๋‚จ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์„ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@alterx ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์— ์žฌ๋ฃŒ ๋˜๋Š” ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๊ฒฝ์šฐ ๊ณต๊ธ‰์ž, ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ฐ ์Šคํ‚ค๋งˆ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ idk, ์‚ฌ์šฉ์ž ์ง€์ • ์š”์†Œ)๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ๋ชจ๋“ˆ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์ถœํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์–‘์„ ์ œ์–ด ํ•  ์ˆ˜์—†๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์†์ƒ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Storybook์€ ๋ถ„๋ฆฌ ๋œ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ React์™€ Vue์—์„œ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ๋„์˜ ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์„ํ•˜๊ณ  ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ์™€ ์„ ์–ธ์„ ํ†ตํ•ด ๊ณต๊ธ‰์ž์™€ ์Šคํ‚ค๋งˆ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํ”ผ๋“œ๋ฐฑ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์–ป๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@aitboudad ์ƒˆ๋กœ ๋งŒ๋“  @angular/cli ์•ฑ๊ณผ getstorybook ๋ฌธ์ œ๋ฅผ ๋ณต์ œํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ๋„ ๋ฒ„์ „? TypeScript ๋ฒ„์ „?
๋‹น์žฅ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
screen shot 2017-11-22 at 10 27 33 am

@alterx ๊ฐ€ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ƒˆ ์•ŒํŒŒ ๋ฒ„์ „์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์˜ค, ์™„๋ฒฝ ํ•ด์š”!
๊ทธ๋ฆฌ๊ณ  ์•ˆ์‹ฌ ํ•˜์…”๋„๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ชจ๋“ˆ์— ๊ฐ€์ ธ ์˜ค๊ธฐ, ๊ณต๊ธ‰์ž ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„ ๋‚ด๋ฉด๋ฉ๋‹ˆ๋‹ค. :)

๋‹ค์Œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์œผ๋กœ storybook / examples / angular-cli๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  "dependencies": {
    "@angular/animations": "4.3.5",
    "@angular/common": "4.3.5",
    "@angular/compiler": "4.3.5",
    "@angular/core": "4.3.5",
    "@angular/forms": "4.3.5",
    "@angular/http": "4.3.5",
    "@angular/platform-browser": "4.3.5",
    "@angular/platform-browser-dynamic": "4.3.5",
    "@angular/router": "4.3.5",
    "core-js": "2.4.1",
    "rxjs": "5.4.3",
    "zone.js": "0.8.14"
  },
  "devDependencies": {
    "@angular/cli": "1.3.2",
    "@angular/compiler-cli": "4.3.5",
    "@angular/language-service": "4.3.5",
    "@storybook/addon-actions": "3.3.0-alpha.4",
    "@storybook/addon-links": "3.3.0-alpha.4",
    "@storybook/addon-notes": "3.3.0-alpha.4",
    "@storybook/addon-knobs": "3.3.0-alpha.4",
    "@storybook/addons": "3.3.0-alpha.4",
    "@storybook/angular": "3.3.0-alpha.4",
    "@types/jasmine": "2.5.53",
    "@types/node": "6.0.87",
    "codelyzer": "3.1.2",
    "jasmine-core": "2.5.2",
    "jasmine-spec-reporter": "3.2.0",
    "karma": "1.4.1",
    "karma-chrome-launcher": "2.0.0",
    "karma-cli": "1.0.1",
    "karma-coverage-istanbul-reporter": "0.2.3",
    "karma-jasmine": "1.1.0",
    "karma-jasmine-html-reporter": "0.2.2",
    "karma-trx-reporter": "0.2.9",
    "protractor": "5.2.0",
    "ts-node": "3.2.0",
    "tslint": "5.6.0",
    "typescript": "2.4.0"
  }

component.__annotations__[0] ๋ฅผ) ๊ฐ€์ ธ ์˜ค๋Š” ๋™์•ˆ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ _Addon Knobs_ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋™ ํ•œ ํ›„ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

helpers.js:32 Uncaught TypeError: Cannot read property '0' of undefined
    at getComponentMetadata (helpers.js:32)
    at prepareComponent (helpers.js:140)
    at index.js:33
    at withKnobs (index.js:48)
    at client_api.js:109
    at initModule (helpers.ts:87)
    at helpers.ts:167
    at later (helpers.ts:27)
    at ZoneDelegate.invokeTask (zone.js:424)
    at Zone.runTask (zone.js:191)

@ToniaDemchuk ํ…Œ์ŠคํŠธ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์—์„œ ์–ด๋–ป๊ฒŒ ์„ค์ • ํ–ˆ์Šต๋‹ˆ๊นŒ? ์žฌํ˜„์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ํŽŒํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ.

package.json์—๋„ "@storybook/addon-notes": "3.3.0-alpha.4", ์„ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋กœ์ปฌ ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ๋ฅผ ์กด์ค‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? tsconfig์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ €์žฅ์†Œ : https://github.com/scttcper/ngx-color
๋‚˜๋Š” ๊ทธ๋“ค์„ ์„ ํƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Cannot find module 'ngx-color/helpers'. ์–ป์Šต๋‹ˆ๋‹ค.

@shilman ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์˜ˆ์ œ https://github.com/ToniaDemchuk/storybook/tree/angular-4.3.5-sample
์„ค์ • ๋ช…๋ น :

npm i
npm i -g @storybook/cli
npm run storybook

๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:9009 ์„ ์—ด๊ณ  ๋ฉ”๋‰ด์—์„œ _Addon Knobs> Simple_๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
image

์ด๊ฒƒ์€ํ•˜์ง€ ์•Š์•˜๋‹ค :
image

์ฝ˜์†” ์˜ค๋ฅ˜ :
image

@neo , ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋งฅ๋ฝ์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋‹น์‹ ์€ repo๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@shilman , @alterx , angular v4.3.5 ( @ToniaDemchuk )์˜ ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค (๊ฐ๊ฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ...) ๋…ธ๋ธŒ ์• ๋“œ์˜จ์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ๊ฐœ์ฒด์—๋Š” annotations ๋ฐฐ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์ƒˆ ๋ฒ„์ „์˜ angular/core ํŒจํ‚ค์ง€์— ์˜ํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „ (์ด ๊ฒฝ์šฐ v4.3.5)์—์„œ๋Š” reflect-metadata ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค (์—ฌ๊ธฐ์— ์ œ๊ฑฐ ๋œ ์ฐจ์ด์  ์ด ์žˆ์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผํ• ์ง€ ์ •๋ง๋กœ ๋ชจ๋ฅธ๋‹ค.

๋„ค,์ด ๋ณ€ํ™”๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ํ™•์‹คํžˆ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์˜์ง€
์—ฌ์œ  ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด ์‚ดํŽด๋ณด์„ธ์š”. ์•„๋งˆ ๋‹ค์Œ์— ์–ธ์  ๊ฐ€
์ฃผ

2017 ๋…„ 12 ์›” 9 ์ผ ํ† ์š”์ผ ์˜ค์ „ 11:41 Igor [email protected] ์ž‘์„ฑ :

@shilman https://github.com/shilman , @alterx
https://github.com/alterx , angular v4.3.5์˜ ๋ฌธ์ œ์— ๊ด€ํ•˜์—ฌ (
@ToniaDemchuk https://github.com/toniademchuk ), ๋‚˜๋Š”
๋ฌธ์ œ (๊ฐ๊ฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ...) ๋…ธ๋ธŒ ์• ๋“œ์˜จ์—์„œ
๊ตฌ์„ฑ ์š”์†Œ ๊ฐœ์ฒด์—์žˆ๋Š” ์‚ฌ์‹ค์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์— ์ฃผ์„ ๋ฐฐ์—ด. ์ด ๋ฐฐ์—ด์€ angular / core ํŒจํ‚ค์ง€์— ์˜ํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๋ฒ„์ „. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „ (์ด ๊ฒฝ์šฐ v4.3.5)์—์„œ๋Š”
reflect-metadata ํŒจํ‚ค์ง€ (์—ฌ๊ธฐ์— diff
https://github.com/angular/angular/commit/cac130eff9b9cb608f2308ae40c42c9cd1850c4d#diff-635fe23be5795132e3385c8f4899dc3aR58
์ œ๊ฑฐ ๋œ ๊ณณ). ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผํ• ์ง€ ์ •๋ง๋กœ ๋ชจ๋ฅธ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/storybooks/storybook/issues/269#issuecomment-350492916 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABhRmCjzdKQq2NNVYU7UTc-NVmvd8a9Tks5s-sZEgaJpZM4I70nl
.

@aitboudad , ์‚ฌ์šฉ์ž ์ง€์ • ๋ชจ๋“ˆ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š” PR์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ํŒŒ์ดํ”„ ๋ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Directives, Schemas ๋“ฑ์„ ํ…Œ์ŠคํŠธํ•ด์•ผํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ๋“ค๋„ ์ž‘๋™ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ฌด์Šจ ์ƒ๊ฐ์„ํ•˜๋Š”์ง€ ์ œ๊ฒŒ ์•Œ๋ ค์ฃผ์„ธ์š”

@ToniaDemchuk , ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ @alterx @ igor-dv @ralzinov ์˜ Angular ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ ๋œ 3.3.0-alpha.6์„ ์ถœ์‹œ

https://github.com/storybooks/storybook/releases/tag/v3.3.0-alpha.6

๊ด€๋ จ Angular ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋„์šฐ๋ฏธ์— ์œ ํ˜• ์ฃผ์„ ์ถ”๊ฐ€, angu์— ๋Œ€ํ•œ ts ์„ ์–ธ ํŒŒ์ผ ์ถ”๊ฐ€โ€ฆ # 2459
  • ๋ชจ๋“ˆ / ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ # 2526
  • ๊ตฌ์„ฑ ์š”์†Œ ์†Œํ’ˆ ์ถœ๋ ฅ ์žฌ์ •์˜ # 2456 ์ˆ˜์ •
  • [WIP] Angular ๋ฒ„์ „ ์ง€์› # 2467
  • Angular Add custom pipes ์ง€์› # 2518

ํ”„๋กœ์ ํŠธ์—์„œ์ด ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ด๋ฒˆ์ด ๋งˆ์ง€๋ง‰ RC ๋ฆด๋ฆฌ์Šค๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๋‚ด์ผ๊นŒ์ง€ ์ ์ ˆํ•œ 3.3 ๋ฆด๋ฆฌ์Šค๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@alterx ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ปดํฌ๋„ŒํŠธ ๋Œ€์‹  ํ…œํ”Œ๋ฆฟ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

storiesOf('Welcome', module).add('to Storybook', () => ({
  moduleMetadata: { imports: [FormModule] },
  template: '<dynamic-forms [form]="form"></dynamic-forms>',
  props: {
    form: [{ key: name }]
  },
}));

@shilman for 3.3.0-alpha.6 ๋‚˜์—๊ฒŒ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์• ๋“œ์˜จ์ด @storybook/angular ๊ฐ™์€ ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

yarn add @storybook/addon-actions<strong i="14">@alpha</strong> @storybook/addon-links<strong i="15">@alpha</strong> @storybook/addon-notes<strong i="16">@alpha</strong>

@ igor-dv, ์‘๋‹ต ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@shilman , ์ผ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด angular-cli ์˜ˆ์ œ๋ฅผ ๊นจ๋œจ ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด์ œ NameComponent ๋ฐ ServiceComponent๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ERROR in ./src/stories/index.ts
(200,19): error TS2345: Argument of type '() => { component: typeof NameComponent; props: { field: string; }; moduleMetadata: { imports: an...' is not assignable to parameter of type 'IGetStory'.
  Type '{ component: typeof NameComponent; props: { field: string; }; moduleMetadata: { imports: any[]; s...' is not assignable to type '{ props?: { [p: string]: any; }; moduleMetadata?: { [p: string]: NgModuleMetadata; }; component: ...'.
    Types of property 'moduleMetadata' are incompatible.
      Type '{ imports: any[]; schemas: any[]; declarations: (typeof CustomPipePipe)[]; providers: any[]; }' is not assignable to type '{ [p: string]: NgModuleMetadata; }'.
        Property 'imports' is incompatible with index signature.
          Type 'any[]' is not assignable to type 'NgModuleMetadata'.

๋‚˜๋Š” ๊ฐ€์ • ๊ทธ moduleMetadata?: { [p: string]: NgModuleMetadata; } ์—์„œ IGetStory ๋กœํ•ด์•ผ moduleMetadata?: NgModuleMetadata . ์˜ˆ์ œ์˜ ๋ชจ๋“ˆ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ any ์บ์ŠคํŒ…ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ„์—์„œ ์„ค๋ช…ํ•œ @neo ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•œ ๊ฐ ๋„์šฉ scss ๋กœ๋”์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์›นํŒฉ ๊ตฌ์„ฑ ๊ทœ์น™์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

    storybookBaseConfig.module.rules.push({
      test: /\.scss$/,
      loaders: ["to-string-loader", "css-loader", "sass-loader"],
      include: path.resolve(__dirname, '../')
    });

๊ฐ๋„๊ฐ€ style-loader ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  to-string-loader ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
scss ์Šคํƒ€์ผ ์‹œํŠธ์™€ ํ•จ๊ป˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋ฐ (๋˜๋Š”) ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@ToniaDemchuk ์˜ˆ, moduleMetadata?: { [p: string]: NgModuleMetadata; } ๋ฌธ์ œ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋‚˜๋Š” ์ด๋ฏธ ์—ฌ๊ธฐ moduleMetadata?: Partial<NgModuleMetadata>;

๋‚ด๊ฐ€์—์„œ์˜ ๋ณ€ํ™”๋ฅผ @ralzinov ์ถœํŒ 3.3.0-rc.0 ๊ณ ๊ถ ๋ฐ•๋ฌผ์› ํƒœ๊ทธ ์•„๋ž˜ ์ธ rc ๋Œ€์‹  alpha .

@ToniaDemchuk ์‹œ๋„ํ•ด๋ณด๊ณ  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๋‚ด์‹ฌ๊ณผ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์•„์ง SCS๋“ค ๋กœ๋”์™€ @ralzinov ๋ณ€ํ™”์™€ ๊ฐ ์ด์•ผ๊ธฐ ์ฑ… v3.3.3์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

node_modules / @ storybook / : grep -r "moduleMetadata ?: ๋ถ€๋ถ„"
angular/index.d.ts: moduleMetadata?: Partial<NgModuleMetadata>;

npm ์‹คํ–‰ ์Šคํ† ๋ฆฌ ๋ถ
https://gist.github.com/karlos1337/18e4538b37128818ec3e4b507b3b3a3c

๊ฐ์‚ฌ.

@ karlos1337 ,์ด ๋ฌธ์ œ๋ฅผ๋ณด์„ธ์š”-# 2616.

3.3์—์„œ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๐ŸŽ‰

์ด๋ฒˆ ํ˜ธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์•ต๊ทค๋Ÿฌ ์šฉ ๋™ํ™”์ฑ…์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹œ๋ฉด ๋ณ„๋„์˜ ํ˜ธ๋ฅผ ์ œ์ถœํ•ด์ฃผ์„ธ์š”. ๊ฐ์‚ฌ!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰