From 1424d6ab2c17623f0484fa86780710071b8337df Mon Sep 17 00:00:00 2001 From: Luc Martens Date: Wed, 29 Aug 2018 01:05:33 +0200 Subject: [PATCH] Use normalized StateNode instead of raw config (#11) --- README.md | 41 ++-- examples/alarm.json | 17 ++ examples/alarm.png | Bin 0 -> 22043 bytes examples/alarm.puml | 25 +++ examples/hierarchical.js | 44 ---- examples/hierarchical.png | Bin 18974 -> 0 bytes examples/hierarchical.puml | 18 -- examples/parallel.js | 57 ----- examples/parallel.json | 37 ++++ examples/parallel.png | Bin 44024 -> 38792 bytes examples/parallel.puml | 88 +++++--- examples/simple.js | 26 --- examples/simple.png | Bin 11221 -> 0 bytes examples/simple.puml | 11 - package.json | 21 +- src/__tests__/__snapshots__/formatter.js.snap | 37 ---- src/__tests__/__snapshots__/parser.js.snap | 168 --------------- src/__tests__/core.js | 19 ++ src/__tests__/formatter.js | 22 -- src/__tests__/parser.js | 196 ------------------ src/buffer.js | 39 ++++ src/core.js | 105 ++++++++++ src/formatter.js | 75 ------- src/index.js | 5 - src/parser.js | 125 ----------- yarn.lock | 4 + 26 files changed, 332 insertions(+), 848 deletions(-) create mode 100644 examples/alarm.json create mode 100644 examples/alarm.png create mode 100644 examples/alarm.puml delete mode 100644 examples/hierarchical.js delete mode 100644 examples/hierarchical.png delete mode 100644 examples/hierarchical.puml delete mode 100644 examples/parallel.js create mode 100644 examples/parallel.json delete mode 100644 examples/simple.js delete mode 100644 examples/simple.png delete mode 100644 examples/simple.puml delete mode 100644 src/__tests__/__snapshots__/formatter.js.snap delete mode 100644 src/__tests__/__snapshots__/parser.js.snap create mode 100644 src/__tests__/core.js delete mode 100644 src/__tests__/formatter.js delete mode 100644 src/__tests__/parser.js create mode 100644 src/buffer.js create mode 100644 src/core.js delete mode 100644 src/formatter.js delete mode 100644 src/index.js delete mode 100644 src/parser.js diff --git a/README.md b/README.md index 1bebcac..cab1d95 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ Convert a [xstate](https://github.com/davidkpiano/xstate) or [react-automata](https://github.com/MicheleBertoli/react-automata) statechart to a [plantuml](http://plantuml.com/state-diagram) state diagram ## Installation + ``` npm install xstate-plantuml ``` @@ -17,11 +18,6 @@ const config = { initial: 'green', states: { green: { - on: { - TIMER: 'yellow' - } - }, - yellow: { on: { TIMER: 'red' } @@ -34,24 +30,21 @@ const config = { } }; -console.log(convert(config)); +convert(config, options); ``` -## Supports - -- [x] Single machine -- [x] Parallel machine -- [x] Hierarchical machine -- [ ] History machine -- [x] Initial event -- [x] Internal string events `{on: {x: '.y'}}` -- [x] Internal obj events `{on {x: {target: 'y'}}}` -- [x] String event `{on: {x: 'y'}}` -- [x] Object event `{on: {x: {y: {}}}}` -- [x] Array event `{on: {x: [{target: 'y'}]}}` -- [x] String action `fetch` -- [ ] Object action `{ type: 'fetch'}` -- [ ] Function action -- [x] `onEntry` actions -- [x] `onExit` actions -- [ ] `transition` actions +## Examples + +### Hierarchical machine + +- [json](./examples/alarm.json) +- [puml](./examples/alarm.puml) + +![alarm](./examples/alarm.png) + +### Parallel machine + +- [json](./examples/parallel.json) +- [puml](./examples/parallel.puml) + +![parallel](./examples/parallel.png) diff --git a/examples/alarm.json b/examples/alarm.json new file mode 100644 index 0000000..85295a2 --- /dev/null +++ b/examples/alarm.json @@ -0,0 +1,17 @@ +{ + "key": "alarm", + "initial": "inactive", + "states": { + "inactive": { "on": { "ENABLE": "active.waiting" } }, + "active": { + "states": { + "snoozing": { "on": { "TIMER": "beeping" } }, + "waiting": { "on": { "TIMER": "beeping" } }, + "beeping": { "on": { "SNOOZE": "snoozing" } } + }, + "on": { + "DISABLE": "inactive" + } + } + } +} diff --git a/examples/alarm.png b/examples/alarm.png new file mode 100644 index 0000000000000000000000000000000000000000..803b81e7ebc3252deb39ff77244bab7a16a5acea GIT binary patch literal 22043 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 literal 0 HcmV?d00001 diff --git a/examples/alarm.puml b/examples/alarm.puml new file mode 100644 index 0000000..01ac089 --- /dev/null +++ b/examples/alarm.puml @@ -0,0 +1,25 @@ +@startuml +left to right direction +state "alarm" as alarm { + [*] --> alarm.inactive + + state "inactive" as alarm.inactive { + alarm.inactive --> alarm.active.waiting : ENABLE + } + + state "active" as alarm.active { + alarm.active --> alarm.inactive : DISABLE + state "snoozing" as alarm.active.snoozing { + alarm.active.snoozing --> alarm.active.beeping : TIMER + } + + state "waiting" as alarm.active.waiting { + alarm.active.waiting --> alarm.active.beeping : TIMER + } + + state "beeping" as alarm.active.beeping { + alarm.active.beeping --> alarm.active.snoozing : SNOOZE + } + } +} +@enduml diff --git a/examples/hierarchical.js b/examples/hierarchical.js deleted file mode 100644 index 8315b1f..0000000 --- a/examples/hierarchical.js +++ /dev/null @@ -1,44 +0,0 @@ -const fs = require('fs'); -const convert = require('../src/index').default; - -const pedestrianStates = { - initial: 'walk', - states: { - walk: { - on: { - PED_TIMER: 'wait' - } - }, - wait: { - on: { - PED_TIMER: 'stop' - } - }, - stop: {} - } -}; - -const lightMachine = { - key: 'light', - initial: 'green', - states: { - green: { - on: { - TIMER: 'yellow' - } - }, - yellow: { - on: { - TIMER: 'red' - } - }, - red: { - on: { - TIMER: 'green' - }, - ...pedestrianStates - } - } -}; - -fs.writeFileSync('examples/hierarchical.puml', convert(lightMachine)); diff --git a/examples/hierarchical.png b/examples/hierarchical.png deleted file mode 100644 index 18d93ddaf763b6d7486626f935205d1192e18166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18974 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 v+w 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 diff --git a/examples/hierarchical.puml b/examples/hierarchical.puml deleted file mode 100644 index f205ee8..0000000 --- a/examples/hierarchical.puml +++ /dev/null @@ -1,18 +0,0 @@ -@startuml - state "light" as light { - state "green" as light_green - state "yellow" as light_yellow - [*] --> light_green - light_green --> light_yellow : TIMER - light_yellow --> light_red : TIMER - light_red --> light_green : TIMER - state "red" as light_red { - state "walk" as red_walk - state "wait" as red_wait - state "stop" as red_stop - [*] --> red_walk - red_walk --> red_wait : PED_TIMER - red_wait --> red_stop : PED_TIMER - } - } -@enduml diff --git a/examples/parallel.js b/examples/parallel.js deleted file mode 100644 index ffc70f5..0000000 --- a/examples/parallel.js +++ /dev/null @@ -1,57 +0,0 @@ -const fs = require('fs'); -const convert = require('../src/index').default; - -const wordMachine = { - parallel: true, - states: { - bold: { - initial: 'off', - states: { - on: { - on: { TOGGLE_BOLD: 'off' } - }, - off: { - on: { TOGGLE_BOLD: 'on' } - } - } - }, - underline: { - initial: 'off', - states: { - on: { - on: { TOGGLE_UNDERLINE: 'off' } - }, - off: { - on: { TOGGLE_UNDERLINE: 'on' } - } - } - }, - italics: { - initial: 'off', - states: { - on: { - on: { TOGGLE_ITALICS: 'off' } - }, - off: { - on: { TOGGLE_ITALICS: 'on' } - } - } - }, - list: { - initial: 'none', - states: { - none: { - on: { BULLETS: 'bullets', NUMBERS: 'numbers' } - }, - bullets: { - on: { NONE: 'none', NUMBERS: 'numbers' } - }, - numbers: { - on: { BULLETS: 'bullets', NONE: 'none' } - } - } - } - } -}; - -fs.writeFileSync('examples/parallel.puml', convert(wordMachine)); diff --git a/examples/parallel.json b/examples/parallel.json new file mode 100644 index 0000000..e9dfcce --- /dev/null +++ b/examples/parallel.json @@ -0,0 +1,37 @@ +{ + "key": "wordmachine", + "parallel": true, + "states": { + "bold": { + "initial": "off", + "states": { + "on": { "on": { "TOGGLE_BOLD": "off" } }, + "off": { "on": { "TOGGLE_BOLD": "on" } } + } + }, + "underline": { + "initial": "off", + "states": { + "on": { "on": { "TOGGLE_UNDERLINE": "off" } }, + "off": { "on": { "TOGGLE_UNDERLINE": "on" } } + } + }, + "italics": { + "initial": "off", + "states": { + "on": { "on": { "TOGGLE_ITALICS": "off" } }, + "off": { "on": { "TOGGLE_ITALICS": "on" } } + } + }, + "list": { + "initial": "none", + "states": { + "none": { + "on": { "BULLETS": "bullets", "NUMBERS": "numbers" } + }, + "bullets": { "on": { "NONE": "none", "NUMBERS": "numbers" } }, + "numbers": { "on": { "BULLETS": "bullets", "NONE": "none" } } + } + } + } +} diff --git a/examples/parallel.png b/examples/parallel.png index ff529db23e8a55767109fc7aad7d906df598bd68..234502fe8d17f340c06ac392260b9b1ff8ae4dda 100644 GIT binary patch literal 38792 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�)~(+=UJ0-`K3ncJ^%Yw*>l|0VJ!d8U-M0ZQF}Wquzv04%kLllz90RU^c%b>; za_2>vb;y&9z!|Q{)#|-5dyV9(^`FlP|9jxp{b$CP?_>tsI0=_(7@y+l>)AeEAm3E$ zeEH+W(dvfrR=|A~2Y~~onnwlqntVOqxK(}fU5M%#oqzk)I)v0}4!nNkROx^1P5-CA z+heQk8w|mB-bHT#D+23|o z{!ae)IoPleWX(*Z#RHmttGnDIGWHc;sYv?IZ2ev4hCoB-Uy!+P&g6&x?snheAnWsn z9~i`i5x|f-%Kp?~qdkkGz>(089NfC{myR9z2MnYDpu&iZ|F0DwO1EyVXmORUo72_# zSCOMBz-CeIQDq&2!^}W^OU!{I{6KmIGtkJHi~iYf5xa3Y?T(!m0}yz+`njxgN@xNA DjA@^R literal 44024 zcmbsRWkA(i^9BrWLK+n57Lab~Mq0X+29*$`yFsKux*McZxa6m{_RsGj5XYpDD8~+>ObpF-+k3VdqREZf>(yq6;numbuNwlNO-{m-dTGAP z4R0c)&Uo=D+Y~;ZmA>KN?Ctg$X7{F41!{mUx&j!R~B*_N|twvf06vNkaA6oZ1YF8S+9-7$T7#u5?7HBO@#o`PA_`!WdCN#nf>bb1YS=F3(wKT?eqa$nh2E?IxXb@L@|5zC@qq;Ga5 z%cCehTUE^QP$9T~opY0QdgS3WL>c8R{X!q5Y9Mdx?EMHPqfh&MX7Qsd7>(u#6q_Ej zrKa_y=agKIk4cmpw1c=GM(N6uOH9MChIf4 zD{IVng2LQn89hHS!+a6(^!5z&NBe|~8%VnSl`9SPRgIVDp~q7H z2gY9J7Wxghjq_VR5`nfp-d`!_4I6wL+|B3o*wMg=|M_ATqz`-a=Y=O8wAi1YADKBN7J|a(*JqPzv}kA9QlD(poj%39P5|cGDEv)YUcNW z!s!ZmDl=kG)DLmv;p^5$@H}SB-uUC-d5{OMuN*##q0Fi{65;8h)7A*ZUIyf^Aa}2h zt{5}Sn!l%J4)c4r1`E19+wTu0OCcha7bw=o^!%g!Ay$v~I@p@0{U_RiO?cPXPf8tU ztHiqCz2cRy>B}6Iul62W*J=e(L;e^w&FIC?!cgPcgXO)|&A4wCDJgB@UkDYh*@F+- zV9Dz1d{2p~BD+UMMlg}Y6cy3`3e+0T?H0%9{KDCwK^az9I0hb$aoE~YW$ems=O@{y zqkbNSVIWTf!wdmF4o+-JO0f#9>0^w4#iVM#d_)$+S*}(j8XN2oDCEuIbR6de<3bKT z%B?w}D2sBoNF6R25fQE)p~XmL0k!6-{B>v{bWip)gp-}goz>9!o?iKP6OctLFMgLZOAL5Sq(^_$ z2)6YGCQwN9vqvIFk*-Vs)=)Z0I>O;=^r_WfxBK(;ZEbCjNd#PhGyD~j8oJcifuyhN z$zzf`wIFPU7=~;7z`yE&c#`Qc211N}ZOFSGcT?4D!RWeQwrW~52FiH<@ezmuENlV7 z?%Y;^0wFb%AivGePDaMYF^ekGNlGRrs7ts%z5z)?K(IG>NmmfV!9nD5?!Gnk4YJ?= z>C=xUH{B2Ob>mSq@51f=J?nv<%zLfgk(ZZtDDVojt6Su2kN@rySl;{Z83xMvf4pqf z`}-ILSUqOkzn{Z|!bSNj&okVp;qI}=mj?YN+hHww%*uGvm`M-tIEaj%wv0OuXwlZ*B?_@6TfY01?i0;}x&iEL>I#@~Vi z19t-hb?IoMqN6XFab+Y5a%8YXdqN5GEFd)HQnSp^e|GxP(EF-B%9GRe?AQ{=)=`w?+rY6m5^Zvd*dOGj- z=UWYj18Ye@SJP<>n&P{r4!e2;SV@GT?Xj zGBwjjOGQRRjAcN|(EqFo5kgPujkR>o{${x>*7#60Cc`}nA{A%Y0D zw4_%_?aBVHxxg|4Ec)L+XVXAeRaJR;d6ANmDk>_1D3Gq8xBq{HAV^9|qEG1YMJ4$3 z>60j#qLvmRrwrs0@sD?cV|EAw5AR1w2W>i8toj&3Qd(M>Ho8mxuUi9ANZ5>mTdK@v zp<;AU&rEN^Ec}jpgux;e5C*TITiy00}#)~w9$;G%htEY3)BV{n3yqb%Q1Y=yTC6}Z3o zHD2)AW(Ogk3fae>H&#>-o$ETuf`N4c}Q?Bp#gvfG#NAD+BH zZA^n1vxc~#TmK)^zYYux9Lo?=QHhdNnSVW3Zd46-Vj(Gs;3f>8yAJ8Y`I`_yOm>uc z^(sIEGpu*r%F4<%^!d|QHQ>!EDwuAf4{t_!^4~XqPD9RBq4g1dN#tH9@#@tpKlU__ z(UFl&avq2&{C{mIjPVG_klQAI?(cjT%a-O5Ek)t>IUVXh`t;OGclj&>p8nS%A1wXf z)xfF$k1zhe{UbHB0_=aE1RnXHWx#s>pZ*w03k@(u{u)aD8gpFy?0k}z4j0UrIxdPk zqB|m-H_7kk3!xjwkcHv6to)d=$k?6V#L;KQHM%Zblp}nxZlb5+bR;t23fZPdfoq0s zhV^cJh_??iv%N;I0YH%3O-K;aKu~6%oBbcuc`^!?(j17f18Ap%>r2`UX(ds_R(*2# z1%Vwvmb#yGKeaBw%k04aK3BpDuw8CRxV*9MWUZIvS@ai*TOY0zaZ%LT%u{az5_G;r z+eF>^FUlLlmo8)ueAi>Xpuk1x`1ByT801g~J&p1v?%MXsy(7sd%Ry;LRiAlJ{FGtD zT+;EnT6uC`kv3XPOpJnpLL9AL(Fknp=IKKo1bYAva4bQv47}q`Jy?3B&rG!Ua$)#F zfFwYJhh&j3LxEa_Hk!rT;z3zp&!=sx#i3cW`XnmwhA;;+AVhf#K6`%IS?{mwp*#+MMe#+y4IeORsvAD zWwLmcr)T?Y6~oACH8w*6CQkJuJX2TRdOa4^jII#gkkQSIfrN7Qq6E(V*_Nf)rPwD) zElc33hY8oU)tgOPGq^e;=v_KE;w1+($6;a$u=%+QbdI=cFdR)z&S(VO)}F-81{U|{ zSagQZ-pRh;ke{owh?|Xl5l_#+Ae*j$iG_t%T$lOJ5~f!n*-pejuQw6#qWG3Lhd@oR zzF$|dMN< z=xDT5*7AGDF?DL_{v!fX(q0&t*k@GBK>WT|wjGy$VDxwGmdChVz-UzMp9eeV2B1~L7TtXY|#e^oR~_B%D??&C@NN+kP`4atZ> z9=!Q|%Ks2{+ux_g=Niqo#|)qo!Ku80i5a*~C49Q*!dLbvuq8D&f_0Pk^2lYGMK%jz zck#Z>w1j(lX2$h&+>e4HZ%$%;J*WBJUE_Rz&~AHdd9PYmS{ga8JTJTL?pNxOyr9|6 z(vV%7uag3-jB&I0Zbp8EOMr*5ajp!dw7mT5JQd&Eo!s)9%2$yK_xttT+dZ@8IjgPS ziM1XZ14M#m2}VjI#qPJx{MWmSw>Q}Z%~@FqqY}v2t_zi>IK1^aF^so6NA%~W>FMrr za%iR#eR<2AHS%`c7RiEW4`*&AJa6ZErqYJTVSg-Lg!h;aVE;^q=Mf|w!A^d(T#rZ- zIR{Hv`-W_B)-cpcQf^12=VvNSM~h}z(b4ZtvW2adM&;*eeA5>J0)l!mmvjq4dQ5Et zztYEPs)kd|IX$ngoOyTD7*fqNgfT@I{f^hLghZ)XX!rZ`y}3^2<2_RI30GI{uNcnr zRauply|+p^%rtaspK8|w1*JG|Bbs!vvXTqjyV?Tyo`w+DQ?p&|vTzI_MxF|7Y%g$) zbWJVX=8uO2WvOB%hkHrdd`_UMYhzVZCtWPWa#jKRSo~F~u6rb?$W<@9a)C z<*X@_#D%c#SK4obaOBgOGjplcuX&&s-8gFvq@_LX)z?&4R;nxoU)bgQC2BTH$GY>l z^BwL^Gr#A$0b1e6qo!M&w0cGbe{)iy8P&+!=>5@)%u_8X!2W9db^T&J)y7>`_SNk< z{BRHeUuZ-#{c%Su=kDs$ACNlphKq*z1YP3{-;G)gB+0Y;VVDZ6c*lQjpD#Ch%*iaD zuJG*GcdHnI?{Wl+UX`w3Z?<_{r#~o2J|Z(MF2&`3-a%X7s!R3ORJ-23*6Ejm zn25B`xPuPE{~TfK=Es#GDkc_1ByV8AbXvQ1n7r|1aeo-8n~7_+ZnF-F$F4XUsyeD5 z09aNd&FX^;B$i7)kIQa8g^?=24h5Fid})cG(B(h+%+6k*u71s4kMzE{*zNk3NH66@WYXk)?xqjasFE_n$|36h>`0PWpd6Qjn z_@!oC6MgUMU}q>*hg>8LAq~q&5&ccouBnL{2|rI{3S)--d5c%bcBptL@mP-hApRnc z17i}JwB!^hPQp25asxeMOzwUSs*+p+Cq?HrIy%xk%|bA~wE7*{fLW0^1n#DaG^>qn zZnBm4%oWgqNL6M*CaGlPB7CkFnhY8hY0PkVXh3Z(asQAyX-SjAXwCfb`@`SDZEWw6 zra}IF&yEQd7mn$rm#I%}= zuRoiaMHiSSK5i;(Sgrcnlwe>uYyySm{XD6&+fiFsAYtFsOaSHCKaxI`Cl6t2zF8`& z)>+pvG87L(=5f7{Fz-(F0(Ak9y>E6#;f?c;<#+q# zSydvnc2L23PZL|aGdE~6BfnjNoyXnHe%Ri&2@1JC8Ra2J{6fIdwL%_Ltw2_b)8#p5KLjwmLql!2Yy@#3(0rrILN4)%#tTU@0@^X1u3|#Hp=}SD%Q63i8^njIkLs4I;)JU9))LzYUj=ZE`Z@2-XR9hz>aq)WPX-13a&m%d7FDRxqGD51 zxPQIFiPh<{{Jq!Ah70`|-6vGAqP#U(j8Hvd72pooi z#-5z6OXbDcUmA+Wx7O55yuJ2lDTD&{i(%m9JzkF`%KP4QvGQwU@L*ICeMsry&<>>R zjc3d5fH0t#CNG#FA(qxe;@8U5%57O+(m>#$;Lqge8*47sDbgARE!_Ecwbb`Ue`SJkggA#Nz+o8VeWXzsjca zEwT?@a0JCDVaqu1nH=%dYN06t5QqXNvWEJA3LkLcgC9DRzZ=T4 zVEX333KYvv9$ge6P-jMN@irH#&rcQ6=rhMJ?r-JV)Z^ zS~#CGQm?Zz@Y)PC3qLr&uJ>gX6>L7jiYh9f2|5MEp1GKfJLoaT>CmsOPWzf${R@Np zfhC5RK!FgIs$QU0R*10nQC%WnuF<+t@_ArT&;u-?jmD*HX=8zA>D=O-Hodi=2n39B zWC(3|cuITvUpO8ITr5o&xEPIKiO<2<0#)ii1mvq%^;f4mr@Q4I=f4t*?{XV%PRSW2=LFJep*QGgi`7)t z)Fv%)`?Lx(R>Z}8GBU`5{K7f^PbKuEhU{=HQeLZ}CRGQd?TP&8@w2_fk)3}NyTcoh z*tZwtleg1vHQU>%wlqyA2bR%X&b4Dh1+2|VZG9LuuyAp42?+rkvu<6hl=ou~BaSRg zQPHZg>{!RZ;L$N|+@)*r_5`Q*Wfv%+AP{XYR zJ_)+l@NF5dw79=3F}VbuiguF*gUZqU`KbEN{3j+zX>DCK|V4Ng`m_HZ5sF~)|UxUjh47!U<DY?mUWLP@ffk@rFW z5QsY>q{aUsu33wDeq8yX$kcEc`mPfiB-5kY^HF+wdbuP7lS9p4KV>)PYDX6u7X=+H z%SsR9exf~6fbEk+7b1caI@jnFUIWz{#8VdEkHM6pEigiNLo8#E^z61&xtdn#}Lu|9V*8bg16xdD67cxBsZ?b2S zVoT7XZV-GQ4PQ>he??sXr((WQg^dcpRDx(`a^MbT0J-BD`moHLR(^HWkneg8MpZ`o4Irm@Vie+Y7s z(5sEdp%Y}8pz2wew~Tg6wY&d8s;i3{%*f>Kzk&?Pv1z6cu(-v(D9j5lJ)!yrK^Orc z@gg4~irG#Uv&87~k=34UMO!_M&L}9wK$A#1Z@gsvqk1flzG2j@B~N%?_p0v+H4^4f zyi#OU4aKK!iF^l@>&+3sKCGqa5>%9R0^R`Qm6@O6mAM}y1gtp3G>*iaO~BQH>kEO2 ziwDYjDF0Q_^^8|^^_}f2+Nh-nDo1H+*8qJW68nM2M+rM=iSLV?^V`D5SBOFqGBYbk z`elsc?D#xXXNgJ(LQfcz*3zLn_~?o&~qefffzm% z<7_wvwlCH_ay7n(TT277a3`2X@%Y352Zhy zOJ}1pyX*XTgd2&j2e>665OKwP6Z^mFV#vqA1NsRhviLCk;R&&yY*zzWT*@I{%a|oK z%L`IjPj6v8yJjsdGhqfUFB0<01iN?>mTtmxvwr0zqvsw#++R((Z&`UB2|%Mje&c#T z{nH4RPhKrbVX~M;@dX0|rg`jdEJV!Ib)4O#T~xozPR4CRyzDlGejuA4F_1hvo)82{ zyLK2VyJ+{Z1xak<3-P%DioF)nF$YNVbCu>3u9k}@P;j0Pj!c>5<6utt)$sBWMQ94a z>IKw#&an{l1Ukep2jQ#ZrFg~O>kFHT?x2gzkx?rPXHh<0GKTf%>*O;ZJ-ajyx{~;w zCJD0Kz4w~2-%!#Lg^#_p@Bop*_X=$(7IrH(9|k4%d+NJ42+ZJZ5quk8ATWTF0(q=w zb4^)UO+n%LH#}hdqu}cM%F>IZ{_E1RXUq~}OQC(efQN{0x;OY5MQ6~eN|(x{LlxUQ zYzQN|a7DqSrbFT0`v$$4)h$-Z`E3Ku(JhCtrBRA1mcc3JruTg@u{I{d5#rln%fQU-( zhx2bZ?G5-Qpm=89F|97tSqrmlwt!@F{q&Tmg$Z$xNfjQK@v%j!9#xBf8433C4I&{L z2y>Kk{oRe5B*LwO0y|K{Xqjs%$R4OMSlWO?jpmF?Re<%xqk#r^b!}LeMRiD-st?m{ zlLViT>_1J)Kmwt)c~`Q%IdH;QRTm>WUGdJ&(|`MhqkA4tOWc5lC;9?9Fd*5p_dP)* z0R0a-UPmGa+T)5b6~l=yDzC9~2mB=j|z z;I^?rRajr%=7GIu#t}sRgDt5fH*>E`Q8SqqJqi~JUsDf}*gDppc@x=y3w>e*Ev|G?eQ;@6YZyrkn* z-@o(BziRqH@~=4d%Hue}w8@Uzj}a9Z2Ra z(qLz0XP+9ic>|i1C0ds@1<+Tq_{aZ%k;g=a`ubL&R>44W?)roU8X@WF>3}`s=hx0s zO8)^0f{u~{xT4+P+Rp_i^Y{k>Gvoo^HiG8&gxG!9*JaiWB5{L0bq^pwQx?>378s7^ z91u-JJQay7tMB#~%gRQHc9lT$D_A{Zr~|&+CN}atqy}vo9oaT(YI71vP2PqE zglH|IYELUJLft&Yg!Qp5oRzf>z~R_|?bgWU;ytk!oaP}WHugX~Yv;hgKn6A=BO@XrqJP7q zYy{lj3%i{{@$vJUef(&0kpY4iX4wxb&3|DkPyx<=vO1q@jtm>PY(FoEt znXTH(5DV(*=>ep#Udu8W9za$E_Z%E-+0AxJ%Z zgAOzlw~m8pa3Du?>=MX_k^S`+Hy&xtA zvLKvT%X?G~>^^3AP&pAK(JLfQmm5)m<4T}S4GoPj1Wtl7H73$tOeANOHkDKA& zGN8fZ;#pW6baYS^7Z-mIk$22P05M&6fi}P%HyY#-D|aa5S3GMkXnNeI+GabalU_X0 zXI0?);Fa4p>mda*j=fN)8@vinC6MG{&?yhn?lK`@zgpq0-tSBlVTWu4P^F|1J&g25ffBMi+P*8Bz zvWL=^TrF`ImzV4e0#5h0=a2AH4_~2E*X2s$3y@p+b816-ck}Z8g729E6~AGp8`ix& zeUJN_nmxUv{V*`^Fke+V;4K>CmhYNy>gjzT(;ZiSH>o#$kW=;yRtR0l8})?HUXv|a zF;m><^Jh^pvF>$i;IfO~octRU7rnS6d7SB{P^D8{VMGU zQ4rJXc*SqSm7_O_uULZ6kUQCLu3;Me(L?j+eOhcya?q58cTK|3&`=o5g8m>%j;NHb zmiPGu?A12h8!lGDJO%4QT^rarp`Fd*MbzMxmyVh_IQ>4s8q z_6A?}kNoS0`xnn`BhP?29emND08?U zujsfQwYRhg$@$9vZm}!CDl7t(=p3G&nw6R2vl<3_X<^(vB}8MU#O@aY>KF|a`mmfl zhA54ZM0K1ssiC4G>cG&kO3<@Ref=<}gy$js-LE>-=!!99bBWA+Ql8DjM*}TwMB2b{ zFopm6u0ACK=QfZkOD#GH{li8~BS&FIA>kcVpb&YN4&8`Wb_5N;yMA!9YY*N1f|8~l zC%OR9h^VNq3e-TIO(5_$4kfWbuXcp6hJl#!sST>*EB8BCpsdmYggF_>tO1jbq|^2G z$CpYiU<@rv%D~zA%8R5*;sjUZl5qH}Xf=~ES-0v&<6__^a#RmY>#18*z2GyKwuDs@ z8AOX;YSF#cXHP9=(rMsfRog;r!tL)pzbwbJ)ug)YbhXd`93PvDv`hw)X5fpTTv^Xu zitdX<(RszUygm;i^s7tgffV3d@BNQsjV3KigAP6%?ZOpPfyR-m^v$P z#GZyB8BJ~QdoDGd;OZWe&9RUL4ebq|bPk5Bc6@12B@wJdEv}bA@P9;!`NuS6d zelUJ*4hei}k~Q-5amo)6?x~+62_BbEPH3UDl#~iB7MQFuwGX)GP-m zJf^9OS#Zdi)QAlZ+}WA&zd#2<@IR)(SDDYxeEu2p$*#?3{y{fThbJc=KbbnOhHz3> z{39SaEv#$_eW@KXyLsRV%TsE?l`TMv73UwiR6mEu@r! zMBCB{%kJH19w{R3QMB5+%{nqIMiwqZsoV<%y1r3uQM2qy?wnNTdQ2t2W1ZNPVIHJm zn+gWl;iHAc;?&QH+1Xi3ea?rl1i?h|sjRen2aiyw+e{n?Aw(nmqL-$Z`R%Bi_n?7% z?&34)1D*B;l$$z_wVG31=*(6;$Wz@pGm4NogFO~U+dQsTcmqVg^B3m~T<#k_xku1omAdGY6MwYyjZ<(HsSEfbX_$QYfrPs~nDN|`D34u5kORrA0dGX^UP-uD{-g?j{ zK%^m0xxaHoMN!S&so?X@y@UgS+s*C0mIhPcb+i0=<$>;LcGj;`>DQZTN~v0mvC11a zmcPOpt`v8V`|Ai_{ZCGnw_wE7HVTI8`0aYQy*bXUNa_DX-AWSlSeTrwe%JX0wPQ~3 z?jrLIeRfykezLO>=2e|k)+aK(@7Qv9$*yb3dA3+i@aGv#Fr>BFN2{Hti=PWs3)J3q z1e4~xH=cxjAW-6dASx^k7in_t9U&5xI-i=PcT$1rF)8GOALqn_ivc^B^z$;343ga{ zC9}Hfjf%n}hj@Mq2`X9WT*2AyT&Ep*eG1iJ_({uzSfcsHVx$7=&mIU09_7;1<@)b& zGq(5QJdCyhJqLtQMf9%g>+6$?2bWe=nH%V)l}y3w-EyN8r)*!0C11u7iMc1FU}xDXuw&MqVLVAujf!Xcpq|djDb8?} zyIkXKycaM?7-j@xz{@P>)34f$hOk=gey3IZ5UDI4k2_Z-r3e*TR5S!6v-$IKD;=Ok zJYM_VLiKWL!pS-6Xj5~Lnzr<=kf>TXWrs!A=GlPz*Wlwa*c_+D?C$olgU#d~2ptyF zJbTu%kyuNr=Ef)9BxpXzrK_uJEzw~M0D{R~S3?q)Ej}Ct)Vofq*4BbswSBX789C3D z$daZjlhJJ1pO~p}GU!Wdo~bxy7!ia*=_6~3YZ4-AX0SQ_XQn&{bnP1Zc_;*N?i zUFIFu^M+f-R!+x0@$B93i?Ij^3d%IB>=>XsVQPFu0zj6XO@RXxadH`wdNiScAlMKc{$JGm_v+;DWcMZLK)Q_%qyv)o?Vd) z>#=qGF^soO2k$!EhIpdecr6haljsJ`a+~xMZ<9;!vmo`3MhLr4(S?DWdQYp zO@!H6@l$+ZnY{Qh71)AjaSv!EpK5!4yJ2}*bw%FI7hzXIUP*b!VPtJnDXRkmTHdG# zfWA(9L3OT$3(_kCy^h;zCXskD?ll(J1n2=R?`i)?*EcT314Rq#em~;rUc<;uzv2@o zPDv1fV>x^QwMt6mZXoeKv!fI+tl5sT@A8{caan7n(2aM>s!LvXb(Xiq7V~3b1YMye zOpy3*4(U2AM*uHUzswr>&WjVX7s2iH{>r>WKD-c(xj`M7nT+RI%M*IB$>T1>n;4H# ztyPRnTIkqnDYUcW7e9oYM}<>Dii5PY`gu)D1;9EO#lIw8JHKDT+$KdjP!mSatzVG( z2$%Y6T5Huk^>5k7i)tUd>VJE`L4zFxjDqmUgT4=&RbDJjR8x zdSF@boM6rZ7nU}L4*MewusRjm(Zq{im=BX^Z_sf3R4L z?cknc^3~HfK=VYgIomf-3GD;K*sm@R^K~l|9wtv-U$-~3gf`*uD&!r%GL-mQVLJlz zXC(G;%2Z4!Uq!@Ib<61yb#mjqCVZsc$0fR!Sn*b zGN{5Plj~LQ>JJe{UD4^sE{@k+bmUhb;Q~a2f$k-(+*<+fNY91*OA!{_P*LI~t+eZp zE7yr_hsN)!F0;0$M2lK@6<|g9t>l{8$~ew(;JEb6;y&+Dg3^5DBx+q9gy=Rb$SZr8y3#(g!%QoFgi0E(6H{C zDrv{{jif=t?WY7D;{4pIk)dXarY4937?qFjp!t+xL0*tyV3~it-Tpx^LeuLe_}t^o z8`w7=*9nh?WvtkZOVzzyvDsnhzy2V^gbHj{rlJoibC}d>s=rjA8|aGBTeGPVYp%T_ zzIx0VZa@;Qy683-%C}qjL}U_jzyl+EDve2^d-8bNh(GP@M;qKSbnvKd`BObnXE$$% zNG{;C6lvIksPi-|7Wu^Kv9IE zoaE2EZLw%eeT)L8mRr&Oy$O=>Bfch_j*c_h*+ea{WxQn*xG1Iwr%@wh4>Q~7z~yaN zVW)9mge(R8Zn?Wl^DipZUys6FN;?~Murj}$A;1J{KotIqtP>Hlx5O$t++-GKpVXT-sa~cGr(b%8UnufL;<}u8V?7?cB0)=uiUJ1 z#}1`a7!i~Fyw+^@Pk-k2sI9U=??7(B3(HB^KTznUl;NjeqJbZRhiKpLeL=GL6;s%` z32rEbG}uEp)zhTVa^2sY3!b{&R^{6@>k#&ipMO8urFL;Ji7Az3G!83gos4rOz$Cq- z7+6;JFO04HLDS-o_kIOJ{&r#&LQWm0^mM|&-+1H(CPESx_j?*ZWDiI4BoDUmp;&q^ zNBrG1yhMU9TQ9Tq)dU=cm49`fIQ5tWAhmfM^kEC>pfNcmc!RHQRn$hCbU^9;D)jD< zKuR;}wls-hC%E+86EV2>Ch3BxYx`T#U$1lP;lT`l0{IoSeiUC6*Qm8gPaudF-hfkG z%(3?`i{&dBCJs>c;lZd7{BEe=m{^^QhEFOELb1KmwXZRJwICHTA2E?aW|Q>d4JT1r z@xd4-1(&?c(Q$hjXmA-eXT;qVXE+;sj!meBF6S9~9)Vs-2MTlk8K>EX5_wCmM&*wc z+3>9LuAa*l%~b8Fr(Y!WT{l4Yko++N*z$9b-)CfxQC@=N1~4n&Ge;>`L8ySkG5uNv zK}J0Wo$dV}q_Iq(*yWU11a~IDL@=mw;N7Q)??&SCa~tWsNgo0#Z0KYLeaX@` zkZI@!kC8JP%w~pC3@6Sjyd};ar_h^h$*>=7y6CJ3P_e@EUXU@wttK)hyPIL!wnbL}cy6 zUA2C(qZA76maCna9VWOF&1i6PF;L@N`M{#Cq|MX+>^5>C`O>r$B{A_Z3Zxf2Cu33- zF;7=v0E8)E_=b&=@@K5B`*2My z*7f;8s-VXmxHUnongvEwyC;t4XK+->@c{BjO(^@+njjW00)?B>19&YkG4n!o*hU~R zaWR>imR5-x^TUS^D)rxEiV^Wn)NA&Z@Do4p4F8a?5A^e((P_N&sDtN)*~(l}R2Ff7 zSAIdw67?MA2{U*8S}-`byC_%~zGRl1RIh)oy(|iUg}tRXc^+5vlI*GjGngzZ7f`xa0Rt_Oa_o;bK*I^ z2zMs%xGOmeEJ=fi2RwyeAR>E~(Dp$ZJd@|z`!A_GdXACpi8T;Z(YsFO`-EP%nb zMLADcI2g$ay2_lbwg|;#$&gPKD0p3RcQPv9`Gsh9DyR+=F;@yEL}7CCU<{!*mZ{(| zF0)?C7b4!8N!vP75ntPb1-Gq{EZg{!#xo6IHX9ooyG!%Ep#1QNM8rHlttP#4>tx&= z5eE7(rEDxHB=0W7ZBrC^aKl0>D+3wau>j*on3=EnYcHs1OvjpLF2T;J2Pn|q`DGPqihcWc>Yt%w-kQp9;o z#pz8w$V1Hr=TGm$9?_ksFWz#DzKk?+oSr$G;A+r!4%8Vs-hI!@q9%j0TJ>-cEO zV+ZbK!J`r85}&3`7u;X%ln@aT-hrD_g3UTwbM+1f!e zaAj&!N-(RXUz2svFN?m^v7TUJ46!-Yex9LRunv*CD<~PiB>!doanK4tK}8BLd~-1t zZ2PvAJlz$wouO+Ps172z?HT^-kNI#kH=tBgKw1rT?4OP|ox-zXkQDQ55RGbd332Dm zK>&>_4NXl6F)=({^sfGXv*C>PVr|(Z_f$S-^N@H-+il>V9X&muQDnyMd}E+gl$WpGTbRLcI=lim;$MXTF51L*>Ar)NR5E6e7}kQx!y;LpsB3mzW$AgN=hj z6)wqTm7Fj#59jTkB=?dkV^mE3zN99kH?{nFrtwyJ(g75|!lq`zV6dV+!Ma;l%+t9X zpouB<#Ll(TWI3svi6|KSG38t~B8r)fIu0-?vo$gbW>qjPPP$7?XP z*+tZHXr?PDsLM-9Wt4#)Yu*n(g5Z4ijw~e}^khZ@i}#|}cOJ#;dgHIhGD4@yOqv## z?;?lw5nju6!hU zImzW~^g5THhs3qhKu3>Dn?$~DjeC<~@=1oj;>lMsAyo6d&Mm-&(4G#~+ipF@#QcF8 z4YV+nDG_=!t^luDPo|*WXq=jyJkL7FXLEC5MZ~m`LMH!~^#Y7WRLaXXI$NVLHJ&`R zTVi)P9UdOuUWS-}R-#6QaVsj)(6RO&PS(%3>yHy0&kCW|^!A66gobT*(J6-h^hiIJ0LH$|kGH({QzS?eg6k`crI)Qo-X$8F%W*Y^- zoTXTNWHCFynD}aPdAj-8fI7GcA&e^BlFw|!x(0IrpuVm#J;Rr@&?@Z3yZ(j4PCpG% zwd(DQ04*pTL!Ul5U+=J?W2wMY2d;9;D!|$%v8VZJzAXh4^9~0Ktk& zb=CRFT1G}*Jbx}aU(js1{K?0s{cP|47d06tXY4|7Xz1kKycCfks!CZMls+n;BV|y# z0aN1HBL&W~_^eNmX_YE17JCMg&q_pV8cB}wP(V#KPgRc5X__Y!s6@tXPsVr|WCok! z!vZ;GjTIUswV5WA+Dp3XH#0uvGpOox^cLl9yI}MRsXGC3(Wv2e8MO~DUn}^d@BmZu z4+iOvGr0q6XgRz4FqLF2wNU_3)6**=+WIBBh1h*TDMC;%)fC}Zp@aThUF{G`%)i+V znC#V`KeGiWpFK;{ZFUz|faTKv#IsR3d05g9E*&A6?gSH#H9GHWfh(N0+FB(|6%`dA zjgh!tr2jlhLcg{b#kVbk@B$WEPTh7p z=%9NNw9K}(90_sZj}rkS0A{JUkFyUVc7D8d^aa?J^!&|Zb^WUMed>b)t1p`_vUbq@ zPMhdit&%RlUhT9PWi2m#ze2DdF6FIIx)B3u?d z?)gu{5K0p}Cy>d!BQggm38$D`?9SLk+;#K)5F&22}9 zvALW+Cg!uWwXG;ERXE=UcSuJ8cj^uQ*!n(&St8nx}NbA62?CWM!q#O4aev^@_x zHcykN-gZ@ez=SH+)u%+>Rm6!ZlSIdC8`p`Cgs*C4LsVHfQ-7?-{Oj_m(<10bbrBq8 zK}idrzF7nZUhk`?(}J4`w&~y_AKei~_^{W0ge^y=rG-_a*=R7>tUr-a_66Pv1bT|G zkDY>Hmu)aXP?J*X=Lg?74QS}?)W>))*3R~36FRFMQ8?{|VmbZLh%{2kp5WoV(mnxD zpy}{C@<|auZg7dg-i-|=G9J0|=+D5v44{VE*5OAdB)kFRst-3iZO6gmHJaTUol9Qs zEsk3&CXhOWpc1{IbUM+>wx{645nDR}SK=YZ0V7ti8)~Z#s!@mf zIUCX-ekcLa1z?{pC~;2$8VHWQ?_3zM!TVS!U`bHbfUqr7W)DdO?ftx4N@9;AYPI)= z=|0b}piJI(FK#kA$3w*QA^|I{CMn)V*dvA68;A2`^+Rb2YZf;wX zMtIhb0-p;oq>KQJwYML5fh^`3h`=sq$i5xN7+)r-O}8lqF53J=!v*(Y=#13--U=T7 zRC_PBW>ygskn|o5{Fi+%Oq<#V6x>b37k2;vJfUl5q(Q7;rxYliK3|@MSt{@veq%5s8R+?fM;$;0U;gEpw#eKRJ$UPP z5x@z{%?UVYW<PUy>f?4X1J)}-vQg5R` zA<(XEm`WHi)>@!_soTp1WGRn3_SA zyKjZ{;-Hw5^&(TRwT!5vShJEwUpamh_XbP)Uo5PGtBsDYRcam`UK}S00k(NR!6Ck{ zD5*UY>k0Tb1(w>#yLIP+?p4mKPh|F3*|etLsmmL19Lo{&2$h@nJg`D904{`+cyCIS2g5!NjtF%Tc#xk20~X>7aWfoJ0lnWf2_S#RGwS2 zC5%JR5Ik4{!QJ7-9fEsshXBFdB_V=_5ZooWyIXK~cXxN~#op)icSipge_!i}Ud= z__>3s>_V<^`MEDpqqoLbwqum3=*2bEnUo~Kry`|NLc!piddY$)o?7NX;Wg0e8gjHB z$=%LtJm|3)bqxAeP27fx$PK*TAl|W|y=h^Q@i^9gShs!Q6D&X5!9SO2INoY_#udq9B`u)!$HxeVFF?AFaCc9+fU11c=RoB1 zj{pjlbjpZaE$3F?$YrN6TJhy#k`Y2J7Ac zf^=RuoUH>0bhd~ssc5I&&NkO!I>4mlVtB^KFF_0*)ZdVe7Fdtu?BU=qY&A(>hvM~n^$0t!Uzgqo7_lV_IAbHsXS`8!Kv>1X zqJ?pS1i5VMDf%W1Cg3?HR^Br)`QU?7cY*1qHHb1+ezS-Os27g%tS*Cp_%|$LZ}z1Z zXlM(1cmM_GUkdz>27bF67~DKv$l-vlFc^<18RDGR+}x~6%Royz`lw`LvfdL(WtADU zIL>!b>$tVshkw}Z=jRs^f(i*Vd%r7_eaUt>Q@(Y5vPK(~Cow1FoHbYlJ)_23@ATH< z8nuZ}&XnPlagZrhDzG^aXkwI3RGvJ6js(By_3rFX^aLpV&~1F`NIj&~jY z@Xx5NeDD!?@I2cbcuh5`r(XM8Qc{vhvuqtmOSEbo{)my?fSzyr;r}2x^1@?084GMj zkx#4Q+~?ka-lM?{{T;J->ZPBlP0R)WDmx83OUztKPl-dDKrediTJ@$H`fV}ZpVj2{ z*s(S`1QocP#@x~hLXNjs`8z-j7Q?7ZDX{6nA^H_{XR+~a^pDKL{k@*&K_$@VZEZf* z#;SvQxZL{r;NT#ac(%d)Y=5SF2d~CXu1^y5Y?Mi*5_#Kl5Fzi~>FMcP)~{h+8&Mkb z^YdVLZoblLiq|!dB+*hKJDSbsa>g7Cklju?@a8Hk$_@V_48V4iDpeLIL78YI&HN$m zl_g;a>C#%)by89?_N4W}X#@0x();lz5^lTY+O1@jCn>Ox!>Ipgb-v&S4GUIf(qwY; z*`Rg&ua1wey96H%t*zyVRT=)oJ8S~^U-%(S?vYWC()dj~RP~SCxy-^|jUjne397$L zJBKm9z7C}tUu!QO@+3X{Ewi{EBxn4od7CtSF(8kbpSO3Be@!r< zU48I{Hx*0N4FDswR9^Z@A2!!pulz&DBcnV4VV(*SO;hdsI0-i|uT|3-aJb;*=Co^6ux`BlFFm>GOHK*|J@zQxgrHd{pvgkUQYo+glw>;0o8Hj_L(6PlvSZOQ&6j zP9S|$E(hz1i?3PIqusr`83*=9MF9V}zT{rvNMaSiMXZ?3-4P>_)0hvIrThG05%UmB z#fWFY8Aw%a?GO=*p#`n+~ti3~K-i zPaw~a0O#IQ;|%a+Y3#OhRdO-t$!57$CHXgto<}1mb*>zQQNL#G8=?o^*d^fC$~il5 zQN^q_KuG)Bn0CZ54a!^grmetQxbNNE5=d0kmGKH4l`(1zG(-PQdem2l)oCR!zqL(B ztiG`4Uu6zgw|lt@fw@6c*%mXovqs1UVwtL4?F-vrf&F>B+AR^oPofemwNNgh1A2sJ zoHBE-Wih)?QSxl1zrJR?1Nm+}D+61o~mxxGK@^GnH|EehK z^7qH)4~${Ow#;vBu*j=(<-ti?7I$lp*MCpKU)>a;-#~o~xzt+nzS5O%d{$WrTra~C zdlt^B2mrmtZjF2_bJ`$|JN4)UYZ|fpTw+5Z+SPKkfHjIwODr9V`tK-G-zULD#uiO6 zLOh8{k9Yc#8)Eo#6-r=K(Tm)q4-emo?Nr)~O+6L_g|m0tnK@xMGv1k#Lips2(c9ZS z2ljD8?^O9ULNjV=t^t*%B>>(MIBLdT9M}gIN2^V@yZOHdfsq*;JiL8=-$&`}L*02l zKPVZQzF)sy4R94BNT@V?-ydbEx4d%|U<86@J=hC|jJ9BrX#^>e|CM+Wqwlf$6fXO!vZi_w#dc$ZIWbEd!v?y;K(4%4cUwd~R18 zAsi20FGg<b$?-1lCl z97iR6M6@73`NC_^d|DM~>!tKH*{#6TF1!{k??!QC(J?clY#er~0XrgSKB~FRhR5TH zz`4M_=NHB7SneG`^TXxbR*G+vON#pDx>7c|kjuni(QBa60(|b@dT~vF7N`lW==TOP zM5Y@(U1{Co-_kn^aPYcCO@w>rU=X}|mEM@2tGT-?Gx4m+Da-uZ(AY>gH!;pnQMs~u z4g6JBI7__}*jF|I#L~8yydSMBaU-T+=0s^=Y*Yst974hbiwQ4~eVi5cG zftrTKeK$8dOFl`fo@eAVf~39%F7Ow>$N6xwJn@i}ph)RX2m#yfC$?SHw4b`pW>fka z_CV|rs(%I_s|IHy6@FU%vgvG)*T%+ozyk>hX?vty5s$zS4%M;Yjvs5`C z(f;-bVPRnjJ+K53bz1{wjPg6g|I|2jJAk0`R6c&zAMId@unn(p%vU+y5cjt&nbOkJ zv$3@m1jURYoPhIFY-D64qbW$&c=}#x{Ag1}y7?@DdJohA$mU6rtUs#<`nBbR6)pF) zmMRplp#g@|!I4U-l`xr+oG;6p#@@mMd>1uKXLY}=@9)O*kpa={ZH^^Z0!2~c9Z0=@ z1DJMg-hQ#5hJjo#0+9WuyRtR<>vXxf!rkQoAUC=nJWtnqz%c_W`d9PK>+L{Zxovx} zDb^?Hv9lWe9}Xn|0s`$J1pF6n$4%5q3G9wMjlIH^SfEcG*V{pyQ8RbR{lnYKPIAE1 zQbQ)x7z2hbl~m}*=`TlTX!!V@cU4U<4#z$tpv428^#Gj&hXKGWh{XZAUeceUR*JnG zmG@Kf=AS-ksK~s3jcT;bIidH2`}`=|?ZJ*-bMz0RVJ2b%?hUOEdj z82Vj6#c9KadqNfrG#BcetpIE9d%c2aBaCK~>f_?VS=k{OPVy(2FS~wZLKon>O!h>>>pWN+tmImz2U!%w0 zG+kXoy4X&`K*I|PC49zstPrLmg*jM8vy{1WW_)<{FL$E+MY2>QTRv&BSigAj^2ao= zU#WElrvtcVCB1%&h=}O0H!Db{ui(?%VO-Ot$gxNSamtBiEE4DVot&$Zy;x(P(duL= zXbcdRp7(`X-6e2i#OW`a`U)8Du;+9~n}2n>a@0!!Iw>*G7*}TVo~FN49vb-j_cQw8 zWFcYTM*tv|Y$Xb3TFC*gvz^V(>!$TyH|fRjzU8Ppm|Gm~?!J%F-=Y|wnizl1gH?mx z`*sN*>g8fMzn*<`wl{kKhx-~b)w1?axI!G(yJsJiX;;>|z!LR7hfk#PmS-o~Y1NIpwq~Oj6prqqoCQ0n z_%fKzUZ`x3M<~=&hCh=1>k9Q7buHmksN~l9zm1{lRN8sTYevKO_+`Z zL_T*8AX<~yTip|taqn}^*uNbnO78UrEk(33 z>3pASrvwX^f2xYSLRO~FWw2!wi=#Ho3mX`Z|BY`pv9}nCo+Q-w&vuBwr3=|%JA}Xy zH+oUpP!VOAy%%?9>6?Vpwy#fpW=@XO-J*8E1Wa_s?@kfxmrPYJ%~U~-UHk$>kx1nP zKlM;-(sOfD)p8_(_6<#&G;s?_rt*`#74A)wY5{{61@G z230wyga+VN12aCb^PE$)?>K1g2o6R!BEkmLBZS)Q;Z@?VmF0DD0h^h>W=v90Z-e}B z{J~IYejBQ(8#ke3SSsh-aSNJyY|u#jaL5ja?y$dgiXdzJ}mrdBP~VpG{{ zl|3B{0Wh>JaV&!UvLE3K5m2z4x$-ztVuLCvz6_)aC?3)X-mk#2ST?ylS`aPI=R}ln zm&?t{=lM;l&@&ORO8X3n<6+CqViL(Wkir+5pghqMe-O z%qXJhFH3;M8(lUQun)Vqr~^(V0CMM)dOHu;avb0}Rj8abWt?|?LId*ShL`ZKE2-)4 z0Aa$@yQrJ$Gx`CntXIN>e$|om(W_u^Zc|`eySP{0T{p;NELZdr z}OvOB2;k`gJ};?(y_n(jcbzasx>t&2e_ zq2eA;VL;n_EYo=+1G;)3o4pnw`pf~wl;W7L&FDFych3~*Xfo5103Akl@U@3Odw04T zj1perRQfE`)yiSPuYOfPeVF?>y!t;QxZfS4GcP>lIr7)w$G7;(CbaKW10@mUrB6;b zc8b>SFJ!oDYJo&;!6u`y7TcsS~wgXk2QV|~Wz?;CNeVsXX2 z32TO8*AuX>1-@g^4Jfm)+M!MZ-N{sHNh7uo%>2qEO0mhrYuuY4$%;6P^PN5?BNG?U z2lPvfp6kqV(nL80*=snlYVa?OEE6(ZarRJw^Q+keNm6bQU`4}?q zm21N(3B`}!2F_IKQlm(31>popssTDQOuuC(0Ka%WVqi?TqMH`{Sb9_+kk z=*J3p6E$Wi5?!CGxI&1DtAL;JL6FelBUD|`g3SH@HUQnuV&;|g(~{161Cvh-r0Pia zt9~@#WOWUx!Ljv^3NfG|z?%1KlA0bdj!W;~E5otF#{sjTvweQDJlA=+< zeoHgJF=`aaAxAIE`VbsLRw@$6d{k5ojrfhA)7}mN5gG@Y7_LoN`gd?x(C3)9cE>O< zZBPDOOJ>j!bMwASLpR3+i?t0~iC6qX?#WA@j4ZJH%*Lf0^9*$n%iNJhu;m4e<*INM zL!)4k!S*SJYsrg(%m^oN&-Yr?l~c^s+4~?;A*&>e(cm86uUz+HdeUt=eqNB^}ho@{yX$^s;2JPL;y zOZ0Dl*G|9y9oTf|Pe@oPU(STEluz0lN`~;*+<$r_?pLT{M$MWYY{s)e8ohyMRO<5r zo@aa^{sg@z3n(x+sGFR0!|JY$YK7NUUTH)_Oj&k?Z6|34cojL@f@fj&f3Zwcm}!mu zuz*G~nqv$@vyNlBhDuU~aYstc96R?)#W9njIwv?`6{NJdZ-HQ^*vR?8{t_ z^!6qhjKZ29s?HEeYdCnV49>SBNPV`2n`h!RVf)2b3P1F%*wyG1eV~u-+W?NPACD+X zlM>=I&1lhifQ2Q5r!LhkTqIa5Thok(zF|!_%%mh6zLx^qlH~OcLrT+pLsvk24q1yG z<2z-Oz4$|{FVb)l_DpJ1irH43r*S8WS>3^ou@S4a!#bZ8uqtIZaIO??zIC9UQ_s`3 zp~i;^4dP!kyUCBi;PEKejrCh>kyFEjYe^bx^tvkuSp03@wN`^0OvV{8*YkF6pDumM zWOqAGNlbiPEFgP>{q=+PmD@%X<~NL|>Zl;7rvydtCgh0}X`>`OnL1__IGPcqq}Lw$ zZC+NV;Xr?-Ya?GD%yLH*S+<39?vJi=c(s6vZ5dyBZUd^S?%!UR{)#Ziw-K>jR(9P! zo3E{^7@rKl7u)TVX>B zFNd$Jtkg9zCgJcUr11B=nAfXOgA*5`8WC61yrFqwE=?i~3~<}+{zXV+W0vnEP!+25 z#o{fSh@38_K~0p3R5i6OM*)uI2i4K>zk`m77?4#LVWpt0Hc|4%0f#KVxEYFDxuBU> zMCL{s8JC7lb5_pZe^n6G73Y}I3qyY+Ysu`1)FmR?kDJ1x9au`>P;mzrw*-+iLF;FPu)P-dyQo_qi&1fk zXl8j0`?UL-GXFz2?W*di$rU{I=!Ze0$jvk)=8uCkJ=8xt)AE0YmDI0f;jfoUB{5eSb<&>6Q4PiwERbl zKdj))?Bz^};fu4$Dg7Y=$oWnH%nwEU(>9d9TIFTSzbFI%QNB=r_0982K04};iHR6% zm+K+w{zPA04R^$YMlRn6m9uh?a|Z{>2R?-eU8Y}biI5EpNyRTz*pREhO>dJ8@c!I= zjRmv!S{;+?XvfkSBRe!vvveSxv6_bl2DRD&d1EXll1{o5s|s^Okf6M|tKDC|`43i- z8L>;UF%R8BY@{xk>p@!>{tOaR-S-ZA2UH_V{#+H@gvPaz_lMNMk)3xG^-Lu>@&mtc z{HvE-NO&((yzeeS|B_#PRFRh_yII)K5ZnB;u-MzXd$aZJ@wBgLk{SjFhYFAJysGMO zq~5hyud!f#}uBPW5se=nG20X0C(PW|lt?DrY# zK(pULepQS@BONnp_4GHn8Sceo@*13dOken_Kw!w!mu+SvF@sbpJf-?+O9DD?2BVad zwkRlEY5lXuw%C{nk0@;a9HZ{K6c&+r=d40w2{}SIf!5!R9Jo*VB4{Zyc2h80?V1H- zsUw+y_XyCNud&Z;xOZcNzPb2YID;v~tEOhE*MQ$gi}Fc1_toJ7Z%;!O-c%7ql}|A= zmNHy-Y`qMa^ zxg1{z3quRc7F=&OQ*#Ml7h=+5W!Io=@v2CGiv^gSY)YS`;|#iwiwH zKm5WUdhPA)MEoAAcZFb-0fZWC#W!9)E|*6q3qYWeo}L~%b>49>R~-}cG?aJ78utn4 zA7@Dcuf_EsVr^Y`DI7hPtzbneD=XXJ`*d|;G%+!8{#hSvF$2SG;AgI-!dQke9#x@} z^EFGg-uLP84-j%_RebMSQ&UqbwXM8gFgwE#U*@u;J;bxYi71X<=00;!4X6!!$mqEowB{-m7_tK!B>pod z5DyCjCv{DXAHl)Kf;$@<7of49=>L8s^C=JI`vHHB(+wwrCEN z@6A#=dYquu^{>#OSUE<{zs0JGRBaKwXhm$gK#d1=g}HHl6j;ZC^XO2ut)4lTYL|~B zIzK07pO`qar{t<`lro?#y(UOiJ?)UC9l58#@^&E-B%o@$xKWsc(c-w;b*cSwf=Kqo zqgNVcJk^cSQ!80A#m0$-jbWS@a^rLq+=CT~rebNpw0#((EqTyHi>CcxvM?by808MX z`65W@>G45VS9ivhoSdBIdP*HGnqE_cNtIR&?51;lnrD!V+|aTMOm`ud{Tsq-wG>> zg*Z5b<&sl9O^9u!tC07gp_|v4?EI`AYuMT<(sg7oWSS^+p%oavmeN*fjZPW$zNh%S zup?H6spqjM_N~FcJl};Sf7sX+BBKsBediybeRIBn{WU_GVV<_^7?CwR@HIV$c3r@) zR+7`56fP?Yhz%V+9j2Aw5BYah2}1T|?ub$axI*@rZBQ~*GA0q-!KrfwDFd-iDQ|)d z25M3)SDn31s69u8yVlaCSVrFHN$we5Hc~#pp(s52Hl(6tic+d{OT0bQ(D$AI0|{&3 zuBrBXuLvXj0roMQB%n$*2NI@$MI{|wd1+~c)Vo3@xJCD^B-bVH7(K9{=)5y(3S!Zk zRyB_7Xjtk97g;%L6?tb|1sq!OF5oR(LuIyI^ow_R<;kiZ6$hLaX2AUC%N*CVd`!BU;pm^LLrzH!S-)(_F9npIpX;0 znw|yh(9d|cUbH(=LSnF+Y3_9JZ9?^6{P7Sdd2m+-xPE6f`SsA5<|bg$c;?3oUDtzsm0ZR%Xr zUUbCkg;Q0Hv6(nw5NT57H$ZBOOE<~04z@rYn7%3co3!mAN5c{TELY8JIoNIiT zT;gMh>y=8bYSQ6hB7cQqUcMbyX0Ol%cL-GZtv&mX64%moS7W zSm`q0e>!*klED3glw%Y=rg=IUI4`xDV3U5IFpm$t>&RqpDhs7Eb$px{a0AHK11Mmo zyF#Z?WYR3Mat_Ks1&;sxybf{+NLw=Y4q#1{T-+}X#qQ>GL%{o%x%n(d^ZAyW4WJ+V zicY+{wKcW9FgmIn)bDw*>kLK%oHQ^4xIty_2>_6(zpMrX#s`-44dm7W|G^MCMu$v* z<+@PMrOwbZn}*#^U8=VcE+p*HpYm$rjHYj-Ld;TLcY;kCOXscb%c$Kl`sSArg>=!V zep?H|&f$qiY;;v155IFwoIM5LDR?$>Iqw>u4boDgz6#u~W@J?08xz^kNe;zC(-gXo z1UE<#o{!~cS4?N?br{fnB{hEJ-e)vtV>&|S)xk3+%uig^xf|4c~#dZTby;M7% z448tV<{&AGbt1I1w*{gc?C(=onZqvIuXVb+xs~Y8fULDWl2M7{U-z{VYGGmF8wRO- zae^8gQqb9s`5sAiSWBsK*Y+M*y$BTmkIgh_TD!cY8N$IkVxf)_n3tFLn*HPO-BEM# zL!n#(=gjmpxc1^>O#Tcq5Ix_h>d^7vy^3RB4A=a)>|s>bDv6fqj)?3T#>h*~QDf?^ zc;R?&rPtOh+bhK@tww$OrhC>-z7W$|g#mz9+jVnco21Iiy&7W_{ovav7xOolO#z&UvF zel6J1w~=gSzP7Kba$5K77o2ka+@fx$&u1&aqX9FciU_ioxVRGfH;45{@oI2+ z`T1a_B*pj9-HfHVtBAe^sOF(z5r%8GwE;piR)2;!>w)ZgjskQY41!J)C>&xw1mZ#sX@84S*A<25 zAuhSe31;Fjx%G6JU_6Umo%_DZ&7;d?nJi&M?Ev$cTCi06FRu~xxrCY~&kd=`0qDVo zQBc(bbVuRGX8`i=K~^eBTCHXFHLkGFlgDTb_e4scXW3AU1T86zs3oTI z&F5~}v0rz0Q|>PI2w&G7PnRZHSa`mEn0w#)*fM6L6vhS|^2QEtO6d-V5vlny;`>ig zT2J|o8!q<4^f5^c$Dz%Xsol5CGSC(6-+ktXSWz5@5hAl{j!b5x^KEikQHLNRL$R9q z4$%{RAfoEhGb)ksNWHz}cX$`OPyR41KfNX0mSO9>5i#zs^CK8VV8y$SGH4(>dCL+b3}hjP&bW$KoHV zqi7boQkL!*NVt?KBTY?AsH5J8N~la7|31}`TF*chNz=$WvNW3``3Qa75GqV;FiHLn zkJ-6*6@}MGR*U#M!S>sf$66(Vpz&PCj7Rpg+%)E2gl}whu?fz&zY&;3Ff-%3^e|UW zmE69#X~GUxewn$xBx598lmnhb-QKgHUh zH5%{`NC5z$`1ytswYQQYhzV#HJG&{dxNnGA<7m+w;g;PA37y9DFi9d5^yRCm*~E+i^N$B>kl*1O6=S{6;i*XXOyk=6 z-~=_BAiUL|#vBWKOt?*xe1SY}tkkF*wm6e@sjqT&h9THbDsUeMWCP7Nn{)&O5&ib) z<{PQPuyrm6yUPYok9SxgNY(FNm9F1`_2=(m>Few31;-CgV$+@>E}OZE<9(En0kWqo z&^M?!uDBBluA@b&4EEE%Ig|745pE{qGg{Bk8qb|^DxIw}uPH(kA9-B3_-bT|WJSHL z$I;CUZ5A^lyENe>*FzSO_LV0p>`RMtE*ZkQ2l21`b=Y2`dY-iK#<2_Y$p`fq@T---y>$(C_F7B{(YF|}<9O-KG&?M!pI@?Nd z4}G-G_x_<%75{hT*p06z4{fBeYd9i*^&RD0e=>i_8QKnUa`lb_UG~rPF7_iKP;<*O z3~lVL0hlrlrjlz@>^5Nqwr1-27n*F?i$BMPKA|g2p`S$=#K@wbqIDy)V30tpssnJ7 zMfnO0{d4gnqqFHa%MkiySwMTC`t4Zuzdss40GdAFx(E6qyzI7QkfSXcNS*n11cVFS zTe?wiA515T!sar1d(S~|GJH6GTMs;;1sVnK`h$r}%#F{!Twe1Z_|BQ=yU|T5FEwy2 zBR*o;N?bY5T&;iD)z9tvbNpkbD?u+K;mejaCjhVj?3j!JcIkyDq))G# zt^6`;T-Z8{8uYk*8xBD1^$l4m+bji83RX@ZGp|6=EDX6cIr zy$-=dpXPBUN^{>{8J9WR9YbV_KM7uPwYzBOZ=JLI(2?1EjGwMPhLWhnQyqC^3>elN z4x+;He7uw3%9q{kbmn~V_WhGC&HTVAip7{2 zLBAu?E&LbLIbvQP%z{LO}hK)(MY#i(5#S}55 z(H8gK(_WQnE62xp@6IBB%4mN{rGuo4na^!8`UP9_8{^9>dvvx~j=$iv5k;lS4;=oc zK{zKr{~V5NA3CeJJ&kFY9A9Q!28vgS7tQ{!KRo#T-R*!aHR9zmQ)>$*+A+SO=Pv(5 zr?xqCrtW&o^F=sBdVaTXq;Y99xu~0#xZvf_o%;A7*lM^Sp}UVuF#Mg-vGCq-t%RUb z1nvFUdFB~)GXR=51SD#l^$@iKNYujolN3cE_J%!`QG91MpEvn8Uoka#d!HT5QGv`- zXVmfOvfB^(;ql=}I;nV4J3MTc_iF@f`dtl?TkGDk<548E_!QF6TwB_9l4W?qD5&;; zSVs1Qs2FEQ%S#5WtsjsGJ4$NGYOIgr3AzN4rE-a$P>cHo{B*Gu00$BP2KI7OsI{wV z=6mE8MosK~m#_PEu%|nHXOrSlG^g>_Z%Y3z&Y7=?oUr9{#(!nGfqbz&px?ff=ufSV z^Gl)OD3=qB)<^mRJXeXc$GA>dq>MNpR%~a03z{Mz(dg!B1IYaJ8YtMee&g|sVh;u0 zed<(Hh-SIF%Y5N8E;oZ`*nbj(&S+j;s^ z)fI^K06P;fH|bdvlksXhoyhA_Ka>))!qzUM2(2Rn8=Cfr=E;Ll#MIWCgEhZ6G9r`v z+sqsVcp|cB`>#G~^47OUncf!3+a*fdbQ*5)WW#b=G095#JN2hZoBVEvrDPq`30;b{ zYu4$ZTKc=o5wY+kMB#HBF+uldNVyRq4x$JYw!ggCCoX{j&n9U)nB1cwEWQoeWpUtw zg>91BZ_f&}vPr@$e*x`_&*LX8vNtknPFbB{%Sb140@hIg8lXzvo@suHtatUj%NeW@ z^*#$o`v5k164oH9V9517xylIUQ^=zgqC*E7b^Ur>F}f@Wzw4&$l`mNs>(#k` zG4-x%003Sq{ZNCurRv7w3Wd1#a6GoyoL0j)IO z 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 bold_off - bold_on --> bold_off : TOGGLE_BOLD - bold_off --> bold_on : TOGGLE_BOLD - } - state "underline" as underline { - state "on" as underline_on - state "off" as underline_off - [*] --> underline_off - underline_on --> underline_off : TOGGLE_UNDERLINE - underline_off --> underline_on : TOGGLE_UNDERLINE - } - state "italics" as italics { - state "on" as italics_on - state "off" as italics_off - [*] --> italics_off - italics_on --> italics_off : TOGGLE_ITALICS - italics_off --> italics_on : TOGGLE_ITALICS - } - state "list" as list { - state "none" as list_none - state "bullets" as list_bullets - state "numbers" as list_numbers - [*] --> list_none - list_none --> list_bullets : BULLETS - list_none --> list_numbers : NUMBERS - list_bullets --> list_none : NONE - list_bullets --> list_numbers : NUMBERS - list_numbers --> list_bullets : BULLETS - list_numbers --> list_none : NONE +left to right direction +state "wordmachine" as wordmachine { + state "bold" as wordmachine.bold { + [*] --> wordmachine.bold.off + + state "on" as wordmachine.bold.on { + wordmachine.bold.on --> wordmachine.bold.off : TOGGLE_BOLD } + + state "off" as wordmachine.bold.off { + wordmachine.bold.off --> wordmachine.bold.on : TOGGLE_BOLD + } + } + + state "underline" as wordmachine.underline { + [*] --> wordmachine.underline.off + + state "on" as wordmachine.underline.on { + wordmachine.underline.on --> wordmachine.underline.off : TOGGLE_UNDERLINE + } + + state "off" as wordmachine.underline.off { + wordmachine.underline.off --> wordmachine.underline.on : TOGGLE_UNDERLINE + } + } + + state "italics" as wordmachine.italics { + [*] --> wordmachine.italics.off + + state "on" as wordmachine.italics.on { + wordmachine.italics.on --> wordmachine.italics.off : TOGGLE_ITALICS + } + + state "off" as wordmachine.italics.off { + wordmachine.italics.off --> wordmachine.italics.on : TOGGLE_ITALICS + } + } + + state "list" as wordmachine.list { + [*] --> wordmachine.list.none + + state "none" as wordmachine.list.none { + wordmachine.list.none --> wordmachine.list.bullets : BULLETS + wordmachine.list.none --> wordmachine.list.numbers : NUMBERS + } + + state "bullets" as wordmachine.list.bullets { + wordmachine.list.bullets --> wordmachine.list.none : NONE + wordmachine.list.bullets --> wordmachine.list.numbers : NUMBERS + } + + state "numbers" as wordmachine.list.numbers { + wordmachine.list.numbers --> wordmachine.list.bullets : BULLETS + wordmachine.list.numbers --> wordmachine.list.none : NONE + } + } +} @enduml diff --git a/examples/simple.js b/examples/simple.js deleted file mode 100644 index 19c85c8..0000000 --- a/examples/simple.js +++ /dev/null @@ -1,26 +0,0 @@ -const fs = require('fs'); -const convert = require('../src/index').default; - -const lightMachine = { - key: 'light', - initial: 'green', - states: { - green: { - on: { - TIMER: 'yellow' - } - }, - yellow: { - on: { - TIMER: 'red' - } - }, - red: { - on: { - TIMER: 'green' - } - } - } -}; - -fs.writeFileSync('examples/simple.puml', convert(lightMachine)); diff --git a/examples/simple.png b/examples/simple.png deleted file mode 100644 index 3ccc044501ee2eca9ea208560848e8cd2871aec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11221 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

N#Ikj+5636Mp8}p58?<3y-grrDJx5sA7^n91 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 diff --git a/examples/simple.puml b/examples/simple.puml deleted file mode 100644 index e0dae63..0000000 --- a/examples/simple.puml +++ /dev/null @@ -1,11 +0,0 @@ -@startuml - state "light" as light { - state "green" as light_green - state "yellow" as light_yellow - state "red" as light_red - [*] --> light_green - light_green --> light_yellow : TIMER - light_yellow --> light_red : TIMER - light_red --> light_green : TIMER - } -@enduml diff --git a/package.json b/package.json index b53b81f..04137c6 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,13 @@ { "name": "xstate-plantuml", - "version": "0.1.1", - "description": - "Convert a xstate or react-automata statechart to a plantuml state diagram", - "keywords": ["xstate", "react-automata", "plantuml", "statecharts"], + "version": "0.2.0", + "description": "Convert a xstate or react-automata statechart to a plantuml state diagram", + "keywords": [ + "xstate", + "react-automata", + "plantuml", + "statecharts" + ], "main": "src/index.js", "license": "MIT", "repository": { @@ -13,10 +17,11 @@ "scripts": { "test": "yarn jest" }, - "dependencies": { - "lodash": "^4.17.10" - }, "devDependencies": { - "jest": "^23.5.0" + "jest": "^23.5.0", + "xstate": "^3.3.3" + }, + "peerDependencies": { + "xstate": "^3.3.3" } } diff --git a/src/__tests__/__snapshots__/formatter.js.snap b/src/__tests__/__snapshots__/formatter.js.snap deleted file mode 100644 index 67403ac..0000000 --- a/src/__tests__/__snapshots__/formatter.js.snap +++ /dev/null @@ -1,37 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`formatter nested machine 1`] = ` -"@startuml - state \\"name\\" as key { - machine : onEntry/a1 - state \\"on\\" as users-crud_on - state \\"off\\" as users-crud_off - [*] --> users-crud_on - users-crud_on --> users-crud_off : TOGGLE - users-crud_off --> users-crud_on : TOGGLE - state \\"name\\" as key { - machine : onEntry/a1 - state \\"on\\" as users-crud_on - state \\"off\\" as users-crud_off - [*] --> users-crud_on - users-crud_on --> users-crud_off : TOGGLE - users-crud_off --> users-crud_on : TOGGLE - } - } -@enduml -" -`; - -exports[`formatter simple machine 1`] = ` -"@startuml - state \\"name\\" as key { - machine : onEntry/a1 - state \\"on\\" as users-crud_on - state \\"off\\" as users-crud_off - [*] --> users-crud_on - users-crud_on --> users-crud_off : TOGGLE - users-crud_off --> users-crud_on : TOGGLE - } -@enduml -" -`; diff --git a/src/__tests__/__snapshots__/parser.js.snap b/src/__tests__/__snapshots__/parser.js.snap deleted file mode 100644 index 760826a..0000000 --- a/src/__tests__/__snapshots__/parser.js.snap +++ /dev/null @@ -1,168 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`root hierachical machine 1`] = ` -Array [ - "root", - Object {}, - Array [ - "machine", - Object { - "key": "light", - "name": "light", - }, - Array [ - "state", - Array [ - "green", - "light_green", - ], - ], - Array [ - "event", - Array [ - "[*]", - "light_red", - ], - ], - Array [ - "event", - Array [ - "light_red", - "light_green", - "TOGGLE", - ], - ], - Array [ - "event", - Array [ - "light_green", - "light_red", - "TOGGLE", - ], - ], - Array [ - "machine", - Object { - "key": "light_red", - "name": "red", - }, - Array [ - "state", - Array [ - "nested", - "red_nested", - ], - ], - Array [ - "event", - Array [ - "[*]", - "red_nested", - ], - ], - ], - ], -] -`; - -exports[`root parallel machine 1`] = ` -Array [ - "root", - Object {}, - Array [ - "machine", - Object { - "key": "light", - "name": "light", - }, - Array [ - "state", - Array [ - "on", - "light_on", - ], - ], - Array [ - "state", - Array [ - "off", - "light_off", - ], - ], - Array [ - "event", - Array [ - "[*]", - "light_on", - ], - ], - Array [ - "event", - Array [ - "light_on", - "light_off", - "TOGGLE", - ], - ], - Array [ - "event", - Array [ - "light_off", - "light_on", - "TOGGLE", - ], - ], - ], -] -`; - -exports[`root simple machine 1`] = ` -Array [ - "root", - Object {}, - Array [ - "machine", - Object { - "key": "users-crud", - "name": "users-crud", - }, - Array [ - "state", - Array [ - "on", - "users-crud_on", - ], - ], - Array [ - "state", - Array [ - "off", - "users-crud_off", - ], - ], - Array [ - "event", - Array [ - "[*]", - "users-crud_on", - ], - ], - Array [ - "event", - Array [ - "users-crud_on", - "users-crud_off", - "TOGGLE", - ], - ], - Array [ - "event", - Array [ - "users-crud_off", - "users-crud_on", - "TOGGLE", - ], - ], - ], -] -`; diff --git a/src/__tests__/core.js b/src/__tests__/core.js new file mode 100644 index 0000000..97ab916 --- /dev/null +++ b/src/__tests__/core.js @@ -0,0 +1,19 @@ +const fs = require('fs'); +const path = require('path'); + +const convert = require('../core'); + +const example = (name, opts) => { + const root = `${__dirname}/../../examples`; + const json = require(`${root}/${name}.json`); + const puml = fs.readFileSync(`${root}/${name}.puml`, 'utf8'); + + test(name, () => { + expect(convert(json, opts)).toEqual(puml); + }); +}; + +describe('xstate-plantuml core examples', () => { + example('alarm'); + example('parallel'); +}); diff --git a/src/__tests__/formatter.js b/src/__tests__/formatter.js deleted file mode 100644 index f83ecef..0000000 --- a/src/__tests__/formatter.js +++ /dev/null @@ -1,22 +0,0 @@ -const format = require('../formatter').default; - -const machine = [ - 'machine', - { key: 'key', name: 'name' }, - ['action', ['machine', 'onEntry', 'a1']], - ['state', ['on', 'users-crud_on']], - ['state', ['off', 'users-crud_off']], - ['event', ['[*]', 'users-crud_on']], - ['event', ['users-crud_on', 'users-crud_off', 'TOGGLE']], - ['event', ['users-crud_off', 'users-crud_on', 'TOGGLE']] -]; - -describe('formatter', () => { - test('simple machine', () => { - expect(format(['root', {}, machine])).toMatchSnapshot(); - }); - - test('nested machine', () => { - expect(format(['root', {}, [...machine, machine]])).toMatchSnapshot(); - }); -}); diff --git a/src/__tests__/parser.js b/src/__tests__/parser.js deleted file mode 100644 index 13a422c..0000000 --- a/src/__tests__/parser.js +++ /dev/null @@ -1,196 +0,0 @@ -const parser = require('../parser'); - -describe('parse state', () => { - test('none', () => { - const config = { states: {} }; - expect(parser.state('pre', config)).toEqual([]); - }); - - test('single', () => { - const config = { states: { x: {} } }; - expect(parser.state('pre', config)).toEqual([['state', ['x', 'pre_x']]]); - }); - - test('multiple', () => { - const config = { states: { x: {}, y: {} } }; - expect(parser.state('pre', config)).toEqual([ - ['state', ['x', 'pre_x']], - ['state', ['y', 'pre_y']] - ]); - }); -}); - -describe('parse events', () => { - test('none', () => { - const config = { states: {} }; - expect(parser.events('pre', config)).toEqual([]); - }); - - test('string', () => { - const config = { states: { x: { on: { EV: 'y' } } } }; - expect(parser.events('pre', config)).toEqual([ - ['event', ['pre_x', 'pre_y', 'EV']] - ]); - }); - - test('object', () => { - const config = { states: { x: { on: { EV: { y: {} } } } } }; - expect(parser.events('pre', config)).toEqual([ - ['event', ['pre_x', 'pre_y', 'EV']] - ]); - }); - - test('array', () => { - const config = { states: { x: { on: { EV: [{ target: 'y' }] } } } }; - expect(parser.events('pre', config)).toEqual([ - ['event', ['pre_x', 'pre_y', 'EV']] - ]); - }); - - test('initial', () => { - const config = { initial: 'x', states: { x: {} } }; - expect(parser.events('pre', config)).toEqual([['event', ['[*]', 'pre_x']]]); - }); - - test('internal', () => { - const config = { - states: { x: {}, y: {} }, - on: { EV1: '.x', EV2: { target: 'y', internal: true } } - }; - - expect(parser.events('pre', config)).toEqual([ - ['event', ['pre_x', 'pre_x', 'EV1']], - ['event', ['pre_x', 'pre_y', 'EV2']], - ['event', ['pre_y', 'pre_x', 'EV1']], - ['event', ['pre_y', 'pre_y', 'EV2']] - ]); - }); - - test('complex', () => { - const config = { - initial: 'x', - states: { x: { on: { EV3: 'y' } }, y: {} }, - on: { EV1: '.x', EV2: '.y' } - }; - - expect(parser.events('pre', config)).toEqual([ - ['event', ['[*]', 'pre_x']], - ['event', ['pre_x', 'pre_y', 'EV3']], - ['event', ['pre_x', 'pre_x', 'EV1']], - ['event', ['pre_x', 'pre_y', 'EV2']], - ['event', ['pre_y', 'pre_x', 'EV1']], - ['event', ['pre_y', 'pre_y', 'EV2']] - ]); - }); -}); - -describe('actions', () => { - test('none', () => { - const config = { key: 'machine', states: {} }; - expect(parser.actions('pre', config)).toEqual([]); - }); - - test('onEntry', () => { - const config = { key: 'machine', states: { x: { onEntry: 'action' } } }; - expect(parser.actions('pre', config)).toEqual([ - ['action', ['machine', 'onEntry', 'action']] - ]); - }); - - test('onExit', () => { - const config = { key: 'machine', states: { x: { onExit: 'action' } } }; - expect(parser.actions('pre', config)).toEqual([ - ['action', ['machine', 'onExit', 'action']] - ]); - }); - - test('multiple', () => { - const config = { - key: 'machine', - states: { x: { onExit: 'action', onEntry: 'action' } } - }; - expect(parser.actions('pre', config)).toEqual([ - ['action', ['machine', 'onEntry', 'action']], - ['action', ['machine', 'onExit', 'action']] - ]); - }); -}); - -describe('root', () => { - test('simple machine', () => { - const config = { - key: 'users-crud', - initial: 'on', - states: { - on: { - on: { - TOGGLE: 'off' - } - }, - off: { - on: { - TOGGLE: 'on' - } - } - } - }; - - expect(parser.root(config)).toMatchSnapshot(); - }); - - test('parallel machine', () => { - const config = { - key: 'users-crud', - parallel: true, - states: { - light: { - initial: 'on', - states: { - on: { - on: { - TOGGLE: 'off' - } - }, - off: { - on: { - TOGGLE: 'on' - } - } - } - } - } - }; - - expect(parser.root(config)).toMatchSnapshot(); - }); - - test('hierachical machine', () => { - const config = { - key: 'users-crud', - parallel: true, - states: { - light: { - initial: 'red', - states: { - red: { - on: { - TOGGLE: 'green' - }, - initial: 'nested', - states: { - nested: {} - } - }, - green: { - on: { - TOGGLE: 'red' - } - } - } - } - } - }; - - expect(parser.root(config)).toMatchSnapshot(); - }); -}); diff --git a/src/buffer.js b/src/buffer.js new file mode 100644 index 0000000..169117a --- /dev/null +++ b/src/buffer.js @@ -0,0 +1,39 @@ +class Buffer { + constructor() { + this.value = ''; + this.indentation = 0; + } + + indent() { + this.indentation++; + } + + outdent() { + this.indentation--; + } + + whitespace() { + return new Array(this.indentation + 1).join(' '); + } + + newline() { + this.value += '\n'; + } + + append(value) { + this.value += this.whitespace() + value + '\n'; + } + + appendf(strings, ...values) { + const fn = (str, value) => + str + value.replace(/[\(\)]/g, '').replace(/-/g, '_'); + + const value = strings + .map((str, i) => fn(str, values[i] || '')) + .join(''); + + this.append(value); + } +} + +module.exports = Buffer; diff --git a/src/core.js b/src/core.js new file mode 100644 index 0000000..4f6a0a8 --- /dev/null +++ b/src/core.js @@ -0,0 +1,105 @@ +const xstate = require('xstate'); +const Buffer = require('./buffer'); + +const isStateNode = machine => + machine.constructor.name === 'StateNode'; + +const getNode = (stateNode, path) => + path.split('.').reduce((acc, k) => acc.states[k], stateNode); + +const resolvePath = (stateNode, path) => + path[0] === '#' ? path.substr(1) : getNode(stateNode, path).id; + +/** + * Write `stateNode` events to `buffer`. + * + * An event is a constant string that initiates a transition + * between states. An `event` originates from state `from` and + * causes the machine to transition to state `to`. + * + * In plantuml, this is represented as `from --> to : event`. + * the initial event is represented as `[*] --> to`. + */ +const events = (stateNode, buffer) => { + if (stateNode.initial) { + const to = resolvePath(stateNode, stateNode.initial); + buffer.appendf`[*] --> ${to}`; + buffer.newline(); + } + + for (const [ev, targets] of Object.entries(stateNode.on)) { + for (const { target } of targets) { + const to = resolvePath(stateNode.parent, target[0]); + buffer.appendf`${stateNode.id} --> ${to} : ${ev}`; + } + } +}; + +/** + * Write `stateNode` actions to `buffer`. + */ +const actions = (stateNode, buffer) => { + for (const action of stateNode.onEntry) { + buffer.appendf`${stateNode.id} : onEntry/${action}`; + } + + for (const action of stateNode.onExit) { + buffer.appendf`${stateNode.id} : onExit/${action}`; + } +}; + +/** + * Write `stateNode` states to `buffer`. + */ +const states = (stateNode, buffer) => { + const values = Object.values(stateNode.states); + + for (const [index, child] of values.entries()) { + state(child, buffer); + + if (index < values.length - 1) { + buffer.newline(); + } + } +}; + +/** + * Write `stateNode` to buffer. + */ +const state = (stateNode, buffer) => { + buffer.appendf`state "${stateNode.key}" as ${stateNode.id} {`; + buffer.indent(); + + actions(stateNode, buffer); + events(stateNode, buffer); + states(stateNode, buffer); + + buffer.outdent(); + buffer.append(`}`); +}; + +const options = (opts, buffer) => { + if (opts.leftToRight) { + buffer.append('left to right direction'); + } +}; + +const defaultOpts = { + leftToRight: true +}; + +const convert = (machine, opts = defaultOpts) => { + const buffer = new Buffer(); + const stateNode = isStateNode(machine) + ? machine + : xstate.Machine(machine); + + buffer.append('@startuml'); + options(opts, buffer); + state(stateNode, buffer); + buffer.append('@enduml'); + + return buffer.value; +}; + +module.exports = convert; diff --git a/src/formatter.js b/src/formatter.js deleted file mode 100644 index a402ae5..0000000 --- a/src/formatter.js +++ /dev/null @@ -1,75 +0,0 @@ -const _ = require('lodash/fp'); - -/** - * Increase buffer's indentation by one level. - */ -const indent = buffer => _.update('indent', v => v + 1, buffer); - -/** - * Decrease buffer's indentation by one level. - */ -const outdent = buffer => _.update('indent', v => (v > 0 ? v - 1 : v), buffer); - -/** - * Return a string of whitespace equal to the buffer's indentation. - */ -const tabs = buffer => _.repeat(buffer.indent, _.repeat(4, ' ')); - -/** - * Append a line to a buffer - */ -const append = (value, buffer) => - _.update('value', v => v + tabs(buffer) + value + '\n', buffer); - -const root = () => [ - buffer => append('@startuml', buffer), - buffer => append('@enduml', buffer) -]; - -const machine = ({ name, key }) => [ - buffer => append(`state "${name}" as ${key} {`, buffer), - buffer => append('}', buffer) -]; - -const state = ([name, key]) => [ - buffer => append(`state "${name}" as ${key}`, buffer) -]; - -const event = ([from, to, ev]) => [ - buffer => append(`${from} --> ${to} ${ev ? `: ${ev}` : ''}`, buffer) -]; - -const action = ([machine, on, label]) => [ - buffer => append(`${machine} : ${on}/${label}`, buffer) -]; - -const ops = { - machine, - state, - event, - action, - root -}; - -const format = (ast, buffer) => { - const [op, args, ...children] = ast; - const [pre, post] = ops[op](args); - - if (pre) { - buffer = pre(buffer); - } - - for (const child of children) { - buffer = indent(buffer); - buffer = format(child, buffer); - buffer = outdent(buffer); - } - - if (post) { - buffer = post(buffer); - } - - return buffer; -}; - -module.exports.default = ast => format(ast, { value: '', indent: 0 }).value; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 3e9c8ce..0000000 --- a/src/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const parser = require('./parser'); -const formatter = require('./formatter'); - -module.exports.default = (config, options = {}) => - formatter.default(parser.root(config)); diff --git a/src/parser.js b/src/parser.js deleted file mode 100644 index f8dae40..0000000 --- a/src/parser.js +++ /dev/null @@ -1,125 +0,0 @@ -const _ = require('lodash/fp'); - -const combinations = (collA, collB) => - _.flatMap(a => _.map(b => [a, b], collB), collA); - -const iterateEvents = (fn, config) => { - let ast = _.flatMap( - ([from, v]) => - _.map(([ev, target]) => fn(from, target, ev), _.toPairs(v.on)), - _.toPairs(config.states) - ); - - if (config.on) { - ast = _.concat( - ast, - _.compact( - _.map(([[from], [ev, target]]) => { - if (_.isObject(target) && target.internal) { - return fn(from, target.target, ev); - } - - if (_.isString(target) && target[0] === '.') { - return fn(from, target.substr(1), ev); - } - }, combinations(_.toPairs(config.states), _.toPairs(config.on))) - ) - ); - } - - return ast; -}; - -const state = (prefix, { states }) => - _.reduce( - (acc, [k, v]) => { - if (v.states) { - return acc; - } - - return [...acc, ['state', [k, `${prefix}_${k}`]]]; - }, - [], - _.toPairs(states) - ); - -const actions = (prefix, config) => { - ast = _.flatMap( - ([k, v]) => - _.map(key => (v[key] ? ['action', [config.key, key, v[key]]] : null), [ - 'onEntry', - 'onExit' - ]), - _.toPairs(config.states) - ); - - return _.compact(ast); -}; - -const event = prefix => (from, target, ev) => { - let targetName; - - if (_.isString(target)) { - targetName = target; - } else if (_.isArray(target)) { - targetName = _.get('0.target', target); - } else if (_.isObject(target) && !target.internal) { - targetName = _.keys(target)[0]; - } else if (_.isObject(target) && !!target.internal) { - targetName = target.target; - } - return ['event', [`${prefix}_${from}`, `${prefix}_${targetName}`, ev]]; -}; - -const events = (prefix, config) => { - let ast = config.initial - ? [['event', ['[*]', `${prefix}_${config.initial}`]]] - : []; - - ast = _.concat(ast, iterateEvents(event(prefix), config)); - return ast; -}; - -const submachine = (prefix, config) => { - return _.compact( - _.map(([name, target]) => { - if (_.isObject(target) && target.states) { - return machine(`${prefix}_${name}`, name, target); - } - }, _.toPairs(config.states)) - ); -}; - -const machine = (key, name, xstate) => [ - 'machine', - { key, name }, - ...actions(name, xstate), - ...state(name, xstate), - ...events(name, xstate), - ...submachine(name, xstate) -]; - -const root = xstate => { - if (!xstate.parallel) { - return ['root', {}, machine(xstate.key, xstate.key, xstate)]; - } - - const machines = _.map( - ([key, config]) => ({ ...config, key }), - _.toPairs(xstate.states) - ); - - return [ - 'root', - {}, - ..._.map(config => machine(config.key, config.key, config), machines) - ]; -}; - -module.exports = { - state, - events, - actions, - machine, - root -}; diff --git a/yarn.lock b/yarn.lock index 84bcee0..aac7da0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3128,6 +3128,10 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" +xstate@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-3.3.3.tgz#64177cd4473d4c2424b3df7d2434d835404b09a9" + y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"