From 4c703cd4be1ec66a27c93631dc21dea093339e2c Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 31 Jan 2018 14:29:55 +0000 Subject: [PATCH 01/19] docs: update dep graph --- assets/deps.png | Bin 73631 -> 73656 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/deps.png b/assets/deps.png index 0b14d7bbedc3d6a14a324fc78e10d6dcac7b188f..2e487ba72076afb916d75381ab2640b132b7960e 100644 GIT binary patch literal 73656 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 Bz;gfq literal 73631 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 From 54cd52612774213a06623defdcd5718ab877584d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 31 Jan 2018 20:59:59 +0000 Subject: [PATCH 02/19] fix(rstream): subscription unhandled error handling - track if any child subs have received error, if not treat as unhandled and unsub current sub from parent (if any) --- packages/rstream/src/subscription.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/rstream/src/subscription.ts b/packages/rstream/src/subscription.ts index d93fd315a1..423dcff973 100644 --- a/packages/rstream/src/subscription.ts +++ b/packages/rstream/src/subscription.ts @@ -138,11 +138,16 @@ export class Subscription implements error(e: any) { this.state = State.ERROR; + let notified = false; if (this.subs && this.subs.length) { for (let s of [...this.subs]) { - s.error && s.error(e); + if (s.error) { + s.error(e); + notified = true; + } } - } else { + } + if (!notified) { console.log(this.id, "unhandled error:", e); if (this.parent) { DEBUG && console.log(this.id, "unsubscribing..."); From 59d2a8a15d8e7cd330bd47cf98d9b07bcb321673 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 31 Jan 2018 21:50:32 +0000 Subject: [PATCH 03/19] docs(rstream): add undo/redo example to readme --- packages/rstream/README.md | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/packages/rstream/README.md b/packages/rstream/README.md index 311939e094..454374e720 100644 --- a/packages/rstream/README.md +++ b/packages/rstream/README.md @@ -90,6 +90,68 @@ new rs.StreamMerge([ // ... ``` +### Central app state atom with reactive undo / redo + +```typescript +import * as atom from "@thi.ng/atom"; +import * as tx from "@thi.ng/transducers"; + +// central app state / single source of truth +const app = new atom.Atom({ui: {theme: "dark", mode: false}, foo: "bar"}); + +// define some cursors for different UI params +const theme = new atom.Cursor(app, "ui.theme"); +const mode = new atom.Cursor(app, "ui.mode"); + +// create streams of cursor value changes +rs.fromAtom(theme).subscribe(rs.trace("theme:")); +// with transducer +rs.fromAtom(mode).subscribe(rs.trace("mode:"), tx.map(mode => mode ? "advanced" : "basic")); +// another one for an hitherto unknown value in app state +rs.fromAtom(new atom.Cursor(app, "session.user")).subscribe(rs.trace("user:")); + +// attach history only to `ui` branch +// undo/redo will not record/change other keys in the atom +const hist = new atom.History(new atom.Cursor(app, "ui")); + +hist.record(); // record current snapshot +theme.reset("light"); +// theme: light + +hist.record(); +mode.swap(mode => !mode); // toggle mode +// mode: advanced + +hist.undo(); // 1st +// mode: basic +// { theme: 'light', mode: false } + +hist.undo(); // 2nd +// theme: dark +// { theme: 'dark', mode: false } + +hist.redo(); // 1st +// theme: light +// { theme: 'light', mode: false } + +// update another part of the app state (SPREAD, DON'T MUTATE!) +app.swap((state) => ({...state, session: {user: "asterix"}})); +// user: asterix +// { ui: { theme: 'light', mode: false }, +// foo: 'bar', +// session: { user: 'asterix' } } + +hist.redo(); // redo 2nd time +// mode: advanced +// { theme: 'light', mode: true } + +// verify history redo did not destroy other keys +app.deref(); +// { ui: { theme: 'light', mode: true }, +// foo: 'bar', +// session: { user: 'asterix' } } +``` + TODO more to come... see tests for now! ## Authors From 5a3c0cce5540c06bde0813395bee65ee63b21313 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 31 Jan 2018 22:05:36 +0000 Subject: [PATCH 04/19] Publish - @thi.ng/rstream-csp@0.1.10 - @thi.ng/rstream-log@0.5.11 - @thi.ng/rstream@0.8.1 --- packages/rstream-csp/CHANGELOG.md | 8 ++++++++ packages/rstream-csp/package.json | 4 ++-- packages/rstream-log/CHANGELOG.md | 8 ++++++++ packages/rstream-log/package.json | 4 ++-- packages/rstream/CHANGELOG.md | 11 +++++++++++ packages/rstream/package.json | 2 +- 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 3482601c69..2b607465e3 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.9...@thi.ng/rstream-csp@0.1.10) (2018-01-31) + + + + +**Note:** Version bump only for package @thi.ng/rstream-csp + ## [0.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.8...@thi.ng/rstream-csp@0.1.9) (2018-01-31) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index e78c3b7dab..7713b781ed 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.9", + "version": "0.1.10", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -27,7 +27,7 @@ }, "dependencies": { "@thi.ng/api": "^1.5.0", - "@thi.ng/rstream": "^0.8.0" + "@thi.ng/rstream": "^0.8.1" }, "keywords": [ "bridge", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index bbfe61f082..ea9490d727 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@0.5.10...@thi.ng/rstream-log@0.5.11) (2018-01-31) + + + + +**Note:** Version bump only for package @thi.ng/rstream-log + ## [0.5.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@0.5.9...@thi.ng/rstream-log@0.5.10) (2018-01-31) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index b142f3c28b..07a29c7066 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "0.5.10", + "version": "0.5.11", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/rstream": "^0.8.0", + "@thi.ng/rstream": "^0.8.1", "@thi.ng/transducers": "^1.0.5" }, "keywords": [ diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index ba75a6a52a..0bdc523fc9 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.8.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@0.8.0...@thi.ng/rstream@0.8.1) (2018-01-31) + + +### Bug Fixes + +* **rstream:** subscription unhandled error handling ([54cd526](https://github.com/thi-ng/umbrella/commit/54cd526)) + + + + # [0.8.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@0.7.6...@thi.ng/rstream@0.8.0) (2018-01-31) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index 8a7b8f7d68..25bbacf19a 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "0.8.0", + "version": "0.8.1", "description": "Reactive multi-tap streams & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", From 03c1d97ae15a0a46c4ea1a5f2d247353c54fd0b8 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 31 Jan 2018 22:05:54 +0000 Subject: [PATCH 05/19] docs: update dep graph --- assets/deps.png | Bin 73656 -> 73495 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/deps.png b/assets/deps.png index 2e487ba72076afb916d75381ab2640b132b7960e..bec353dded5659105aca7ed523e5048e7dcf68b9 100644 GIT binary patch delta 43488 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�X>&omX0`~wt`$}&QW`0FWTk0MKhWXV z699iSNNhSGw^aPwc{7sf69SsH8(8bg1*z}Ad(j&|a=B#-xfJk~Dbu-W^?lj!_t7RJ zL1lUX0d$R8^-+?@dtTbuZSpZh^qqs2r(BIRAo?&bvG-xOsyszA{si?AJBRqj{O@zf zuLuubA>YNpI$t8t`L%0!!uw008ss^`m6ZE`s&J6p)4T7_R5OI5m-=^q_<`?yHe<*G zbM_5tmYIo~O}+#&+d`LfP0q2?-Hvk%$KSX%MZHogR}?|)D!Gj9X#S0a<6)Wh;B{4U zvqTKYb%}mzme0}GM1T*Qf$kzknPFS=ZiG%T)*UpwGY?ky@;+;p;RA|%p({PExDOW~ z#2^1^yxl$-`;r*Gi}FT%!%Sv#lmaHYSCq8s&VW6!&R~{uJ-WxQ(p-O52fX8vK42vC7}S>_{SCrA#J?!<#6s`%Vgbv} z!RB5Okq;VOPwyxPuILU`SZ7|J+@ZT0(|FW%l>An?t4cL$QfEAs2@ujhzdM;=7N8zF zz}(LyI}^Vp;drM{g%_L<*yk&wMmZ*F&H&O|K?ACfTM52tKk8X&^De%FaTe=%nvH5* z=|9syft-(jGLHJtIg?eo6F*5(>)S~xST3}Uru+uenrTCy6%N68hL_-muiHCQ%Hoh2 zQZ#g=;i4|68LGTgOJz-4MHjYX&m75`)(vQ|$=OBIx@n0i^2J0*Rk>;$uXi$-WxvTy zz5wkeCdvXc?|LzdUV7@{AhV*B_?Pj_+juO1#IHhnO%l?9kw$<6O{1O@26x^^#tmc?J7^0CzMeo+|=^0E|v`*E)ZTjIE5blRRM_kSLbc#&3EOc z8)UoDcIf$SV0Ll)*Rto00Z7MF9}T+;OQrsTmQ1lnQjXe0hsrYh;M~GC-E=XaN-StI zK{7)qjJ)F5l<4fyRv0ob$Esv?8v%X1x65NyIX3w5$2_vMD@4K*4`-T z6pC9Iz~}d4aBIhC(QqaDXN85%(1-*LDxLU}@kCHS8s{6QBt*Z`{xP%*8qTB7F3;=x~Jz*nI>zfgk@1;>fNAcSx?Z`T560Y?;r zBtJ_~W;g!VvPxzUKm8VF_8SI=paF~vLuXUE*|jp;uujQTW%g%JJ9Z0Razs2PGyFTt zoK53Kkv}x=waK%+bfwFdcq=Y$plR6ZoFAMl9WhvT%ls7lAbp8@5dXt`9!2duusBEM z$Bp;ILJCcQ1Q7n6DJu*MM$l$i!6${rzaaeVo2VJ3@u#+E=1SB6Pmg_i#J49DoEP^N zM;Xa(T2*g9&{V-{)X1XXj$U2=#Fu2k48f{*c?-!H!wETikH8Pp^83% z^GuxU49y33onb`qkbm)JPOPvK$P-s17{?1NLV+PRyKS6elhHJb4c)1KkuU}?{e#UU z*?8l}r@C08bhdhYdSA2$Cp{+J`nqPCcy|a1fknP$+*|Tky(GW!&$fjrjg;ze{K40v{=YgBbSC;#0^xBxhzt~r_Zk+S*pRJ}A*V916Yf{SyJf8A57O>vHf9VQL>>z%uiuoH+O|EV zBj%5h@4C#hsi6WRG~vls4v&Q;=;JwaK9gC(XRM-!O}Z(jn{2F66Wd&b8Rf zTq3bm=5Koc{RR9XWxV>%YxGU1^v;ny0x4ElFs%e0M2s5p0IL|oNCUdi(z#QqNHYF+ z$p`D5KI|J@2Ub|r*0V**Uo&z55cCi5Bz=czGuO`7Pe8v+N!-oRQb|){L8xc!8L=x5Q_})fC?edhinnp++B@m zWfqg8*&ZUH{;|;&_cwOtuOhq7nD6+hLLm%hrlg5)cochKb$>u{z6Hjd6Rv0c{g{l> z!U8<`P-%Sza1{r6_%%IVA7MoKUV_ zK*n>xeW_f9^`qoIB&Bk{c=AXO9rBj5o|dKrFZ)Zj*ZS9=YW&SgiWJAnKDhLD$#uPn za>}G!^h1n6GpH^@&ueK+03%62%7NWh-_|3GIDq zw`c=A0u2xAhVXzuZz5vWRmJEY<)bf{s$cO$A;NhDfo=CGI28{fz!6ufCB+X z_&HXwgt0fzW74u$xm`f|bWrv>*=h*Wek7iT$4Bd4x62!?JgR>+59aK9K(@ciRY?XV zw`c>HsVXJ&8^i~6{6KSW&;sR*;BWtOE@TYsfqa2PO3v;<1>C!!DwV#^p!(v$gFAh!)brK6Ka62^yMH9>q$B(*d%b(akS5~$ z7$+f(=5(3+zF7i^5c`$%fZ&y-8MxU}!PAmR|1K)Si6Qgm2bfWPhni4lf2_iT7 z6}!yapRky-4U+};6&{c4hpA*X^^ByenCm_3pP8c8<>=G92VD&KqMa}UZ7qNOx0UXr zSEh0G3!XK|wRT^k;Su!FSAC9wPAoRP!--*-L23vxEx2;?JHRG`)_yEewGt6dM&SVy z3q$V`^=9YBF4iAlG!M37lR4of8Y8nDhHBl8btV2rcDguNN$=Ao02iG(wVB!81 z?1j->=GoULR|BFq1mC%T(px;7&JPydFDs-t_2>)fI0x@-Q5z9mJfs7v<&!)qJiEW2 zxzNe?8A9&NOz`D@6iM%3S@gHdhH>{`_x4A-`6AZUosr71wLgvGL#^$=W{EV?eV9wj zietN>;ZHeuM=K2yo(bQJvvJOLgGQU})w*jlX$H2xhQP{eatO1~C&}JI?~8o~2$pVJ zu`-x~J+x0`dh4F+b0lmq_fzMU`j{--y?&1eNPV5feJ+y?U`>B-ytc(cEWu5hIy52a zxbn=BMG)K>`;>BIws009<1E$$eJ_>ubGJ}eY;tqPmy0~1YPk|?YhXn#b8EmXv2yhrd=;xA=&ucoZUfNySrxrzgYc%nzGh3U1$!pq$W!rMEfz5^L;9)`MN z>`(&+xR-V;Pm_CHv#-^jZT-bBqb3P^Iv`~?`FIMZVvQpXeM1CzU3LlD_7uj~CvhS; z5hPFvnlV`j#8Ts+XmozbC#a%B67KX#&XBs0Rxk=;eGl6Q##B*t?F z$+V+=)b!0YMDwQF8|3NRLV-+288yBAr2%^Ar0<91LaXM$PG4OGi(XPriNx z*Gy?Q1 z?~dES0?d#qEGHC5UuWSOIAgkwDcjg}(*f#i@+St3hn7#2QB5OSapa0@q)E&Jvq2!@ zWvx!5@ar@(63;O=LpS)E%P=pRsfsC-=^L7fjf6X*sXGXMp2OOSp+l)sJ2>@K-PfDw zEQJQNUdbK#bD;ods$(=CmoD;lZG2Vpf}zY0sa+f#VCJ|ZkPg0Fn}em@CSMn-F6#I! zqoIUEBA3Nbk3cY997`MEjCva9;;&VvnS4FdT=HTAh#fR=3SbX}%eO3*^FCR#zsQAa z1Ib9cJ5TvIjf!K(slrDJZmNhcI#tu!)kF!w9J^l_J|kDv)38I)Olp#E-)u{it}o_K zu>*!pBYvRiZy`Qzh9Q%qGpoQI%4L=RK7Ae;UgQ=-q_HfIPI}dXKlG0L)q9LbUVJtg z%3&Q%nb&iv-}xO7t>q5h?31vsLb+m(mK&^9QHgTkHW|BgAYdb?jqDMZ(5_?-3)+Lk9ap$|?28$F0rv5|RdJI+*uIX9+0?qu(j@P8HOt?T>p zOClZ@gPsBe3!5^7TXX{w17u3Ypki|ziY65<2scofOSRrk{4s3qTs1jJjaK?B+`7plxW530Ys zJG1W!Be3qx&VsMNrBjITc%k25mQnS96%pDrm|7*=Lnr|!lO;B}iM|mgQP7w$Vy2jOs0s2t>5F_@CV3JoZJklE-v=veR!)h)48z3>0HL#2J_;WM|G`hi+qShLtO&Foz0N+hi2- zhRkXPeBjzNU72f@?o3rf1`+thD^)kKI1OD|rrO74 zSU)1#1~oNbv^1Mev?u1iT>NgE|4&A5Q=tOgPqT%_p!c(n)$`fi|Jp{5Tvv%d{G1xq zM+5G~i&lcS1lVZ2_CyNmeIXc=1wckhUlsb!-OA&IaqzB3+k#t@>-1CG9}zNH1@E_c zEX?VD-_gt>SjB|X+8ofs0xU|bLUP|IP}7*uywJBt9RED@GE%=Y%(ZAc!Qll^h5Ino zk}ACL*vI_>@TR=OQFA9H9VAS!)kXGbg2yX;6M}j?^4^vC35UOn3#~7Rd=WTf)WNU_ z?>XhG${LS|=xPVD9scWY)EW7lISNf>{+DVTe(sECGE{PfO?q)Vtnmiq>4(? z`C{%4uML*Y$nF7i#R0qc;$NHkeUG6K)>)ReY0|SNh?VbreIij5cuDQ6|F-)&brria zYmydG5~IY~_h|L2MdX+ncAHOK@Mz<~i>+!fyE^%B+4Mbib5_pQ+#_@>yUlZ$vLI9R8gPa!0-fw&fiXBNut}61SU$!s{ zPe)eK{ zmFMkNNk2X!p%W?P{Q(0iVvtlutoSaYc^{P-dvVW$9@N>iRe9Vb}Q>nKvS(SLv?OweW*d#Q635h(6!y9H5W@+ft+<}Hss|*Fc~D*M`ZT3qDbv|PGnJ1;7L8)eu?k4&T=3A ze_BH<)*yeA-MtHJ&f|p89(@BFV!*J!Y$rFABx8WF#l>!CVRr`RN|HglSQX>geVvwARGA-Kiy zV!N|v2c#>wuBcvS>*)5g+v+uaAZ={J$m7}#2=&cELipq)RKNmjcwQ@3D1p@c9%!$S z+?ju8b7v}gF58vz)U>ERJKPaHi>w=FERrem{Kpodiq`#+klIxedB>B6$Wk}e@2 zxpau6ba$78fG8;;-AY|TxG6iE?OIur@%PHB)5>5>uz-e>*(-aq|-?A`ms%$zyr zjN4AlqReOS#EB)yw+YLdG9mpe)1^2hs<$q0VJ$*r7 zSTkx8)x9Jobg}|Cv25)(cplx5I!cn&f1?$%tv`A1~Ra^ z-4wtB!Dh>Ub{3c*$bKVfY0nYGY|0%LkZLv(R^7Cr^j1G%{3$j|m&V_UM7ppE`dAjG(O;f0q@GEZo3AP*>Pq~H9<>jS zGnA1mY1vJ_phC#R?18^xV@CyZkVj3MLa&;he~kr8LIqPoVI<3ytH2nlKD6Tq`m^M8 zADA-~-WB~SCZ~jVwBJje>RMrJ#=9AFD$ zrn;(kU$J>|^v)604}vYjWWLG`ktfjjyLV#(HO<~z6PbSI{wCn9xw#mQ3o3j=KQ35y zegtwgDOt;Qic0cnIY%G7fLBOa_TD3^$x7h7(7>n=A^O6wNE8ADna4OU${n0i4NW1euuFor1mJkS|I+}kEX!+-7kAQ zIczV^+1~_=4rGZ8jd1e)M=VK3&_07!lda^YyYJrJoE{&co^)RAPTmEu0GY;Uz(%IH z_j~ZDJ97XH*+#oZNQ1B%P&~_j1GCKIWZu_2ax3%SsU^T<_N+Yqy5kJYR#1fq3y%em z>oW>Qi6z|}*%$zt>P>NtD~(zU_9;jg0rwIHK#VQ9sp#9pH( z8`h}&8WLO_7EvdK8ZXspvjfa=m~febdS7so_P>!mV+$t< zQ{-pW(RbUvpZ5z6^_$UG?YV*_E(MR!_8aa`~-$0=iMeUFsM`YwIfsN}O=+J}%;ug$UUR z67WX0#99{6#MOJ@E#g~cD~KjFw{Cgnw60zuMNG?-;b2MOBimp98TBBbc4|xnUKtx6 zOT*IxE8x@f#kja`A==t2bz{H;)S42wC2eK5>x(OHIMSI-{Ew-_2J3fIvRDKy`o8V3 zaiyd_5WT5j>N9)~egZI(qsk~E$L<1sd1j$w#K4}5E1L3gOV$F|o!qRGvbxEarOLNx zgM;GOgl>BKd0G(#o-IYnZ}ZiN*$@{HuWF}TJtW6|m4gnlkD1GXD^F||pzX6fym$2Ds5*1p@D*ujCL6cs>kO(FV7bBwZAM`GWyDBYnWv^B& zuiuAZ$U)bKFPl~W(%LrjamHb^=2uMo0ljl5yxZaX`?Oh5`gS;f*#GVm@$U?EFk*x# z#8rV;Zf+*s(5srWT&}TVV!T|=_wy|1Vh1g{5{dPH*?Gfx&jw+Diy51#Pe;4M6Cvvj z4q~ym=*+`c%(6~6%fFCOmA-omc^twrZC6T+vPr8z%}G%4d$Re;5XNf#K>=E{5rPsw zPn`T$Sa8GYO$Tx$CZ&ML#-$_XroaWgcb%FrvSpr_^hWFqxLqIE9#!@bR37Z?+#w3V zN0w)Z-3+#S`OoAi2?5XOthO6^y$b@3TgLGokQYX)`qGk?jAgk3Y}2+kqO`hgHE~hPra@NOxb}x8o*d&qdZQ?V9AzH*?o(Wu-H%krTKbbvyp{s#+|ec3yQZL zo;F{9ojwFdQ$d`f%;9g2r@>2%|4G?1*HV5vY@7Txr-VTzZxMXw`Hm+Qd;+p<%e--t zE9tG$;-SrF9lTc0V^}-DS5sHQDBLgo)Rc0|0CC=D1$?!}WBZlS?76w4HDDt1azsCC zq0vin2VViSng8xxUwyg&ogGslTN98 z>R|7cPHWpMM^X`?GE!Z`h?IeYpvVDv6Xb+qV&SNQAXlQP9P>`Y+3&Xvpb8c;4y(e4 zONY0{50^n|kiMF$B3EgB&{g{>5qm5adl8_NyaZL|AfW4T-$A!*#A%L`lO^QFsZSXW zm5&{`E#2Q*h3wyF?3S+5irCl+(D8EKee3t-k)7ke9YT(oHK3mS4qBp44X{-_prp1^ z?ye}3vu`OWGhy#|o?bm_Jc9Ux4^NjwN^;P9dD*ucpCu|KsojN9V2DxENZgZxm#>bM z)cGH88h)jj%_+E=*cf13b@ub@Bae_3COHES*b#~Yi)|+lC3htzEO!@E7P)eSTQH&hz$I~7f9I0rnu5TFlSa0;cKNa->B}B!fMwI>ZbEdGpYuZI~xj+Bys&YDqr7g{G9-@m(zkJ zMTahEl+C#3{$bqRM>Oq`$z0U3wy~C$Ge62q_rcBGNz3rVH*e6Ylf2AR-B5bv!stLF z6Vxcpu2!4^a4x0bgk$ro!MZ9X$8e0Vt1LMgz8B}4L{$`cNC>+$&a)cc} z!RvkAf^)7PrfPgmoLI^0@3}#b_;J;l@)G3B<-*%eQ}yyds^0Y%K+q{GZ`|gMqU)CD zc4EY3^fspA7V<5lHLJBm*kFTip#EpnAltS1vQ~2^R_t~f59|P=l-`!!r1!Ea;G=NH zU86-c=83loxcqvB75(a1pi7pnA!of125`pgzTshtDVaksU_Vix}IpSn|bS^w)!WTT%Xa$XU<(^vP8ewAS;bJQ{SYiqEtgA zSUf&6169iC)z8rEMcCIMUo6ta`ZD2Wx*l?}-sT^fSQ450$lx$S=z2sgV6w#2cXulq zF8)*N#dw#A4P9Ff2gE}#1U)|c1ht4Oxk#&)NwlABe@JAvy^coN5W%CX2{NO z6O!(Kt$*!1=F9I}W~E#0Nf@HY1Ym|Ky9Yp>><>i1^JOMg1@{X0qpX>4rk_;rhE0uh zI)g%iqAn@NXNJ>Nw}HjV(ng!K+4OKM?v^xWviq}b;MvkP4@*h3KXAp!?CcihLB<^k z_9i}NVs814fD%jt)VDRkl^{E*Kgo$8Ey4&7$U<-{7|wJUV?rb`2VcQJmBlLwQJ9BfVz z@d_HjL-!&*Fee$yUKuO!1iQPv9UKcp+FJ~M6Q(%0l4f;A*%*)JUZ+L6ER~|B?m|(O zpRJdgup8Q}rfzl)5AwmS;=o=}OoY}l?N|^TMA$^pY97ep5o~H^)tnG4Ty#VbW_+hhgL}fJnqYHLE|Ci19o$MWl?85(Rgwd7DZQooZAX ze*``BZwo+VNEk_bZD%khsluU3wKWSi@edB_3qY7PH}{S-)3uH4!-Rq64Kb%FzDdx` z-zT$fob1k~g0kaSoPh#Wwx=q77Wg*3k#0g$qt4I*jTC0&-_U z3dgmC$BKo0(5{B4_{RXajuakV}+SmLqdIGRJ6nJ{#Dd8>Kw7Ll&1IXYcMrENnK?m} zX+l4XCX=kHKXqvpS#}8WI%FShFY(WAmPd%;kV`=7%m(-Ir#-8Z5-AvRplOR7%NyQf zILXP4=On&11L6A1pOfU4@dslxtPCX-j=i4UHr^P*I*F)IMt!v*X6}Q?*tNY9B@d%A za#wt;Q=H*^CAKy${!$E(HcFf zHd7o<71!n+qs>Yo+ArHHZ8iVym`E`pd9dW-=tQ1hp=GYZ>O_uP%tQs1V?(U3f$lO0 z(5On;6@Pm}KDHn~3IQ5+rc^AIw45A?!~Ex(xLTYc+`4k$-YvaLugj{JeunhP-Xa|ZwFHkUSEEXIH4fV~p;()a+hT2q@MYK$o|FiAk52 z374!5-Qit6$Tgb-X+EhUVLLV?BFIdgzg@g{5GFWN<6tE?&kuDRe;HNd^^7}so`o*JRO`bC>x5BsD3xLp6e z=%B|H;+5G7+w&_CE!2)>j63)hoPoY&AWu-0!Oa0q2+JqmxuqNwP=+?d@SdM9&3P~r zwl<8srz|5IKyvv|GnmnuSn5dE7o_9rk048ytmIKEY{BIxBx3z;q!jFk`^@B*AV;XP zsC=LKI`l^A3LY{LZMG-@(4~3Smu5_KIpWd_^p6oN_?Ttbw?h1Z7sF$l?7=j(Mv`1I zO$!@}oQ1!@&C(O(SxEVW%L)F3QxQ%7&0(GHtS5nCTja0<#D?k|P3XrNCuhiE2=64w zK{i;}ZcIxgE&No^m)o}6YX7WD=Bna_LpNO(-EAWCxdlcZL_tJ<2zEsG+f;gGi*bB6 zWjP=MZzf1?TNh%%OS|PUs>a@9PiiE8d4B8(S|>HupJm{aMF0(Z$W@2t_!g<}0s7)U zGRFnb^1S$cc$w|H06j}E`HVwE%@VXc7a5!pXF&(rrdHlz9?y0D0L;*%ZgZ?SF^k_? zSuk5&?S>8V)b4~FuED~cmv>_B){32gy#dHE#g%*z!^b@jdsqTV%rQe%xp z&~r7Be%{HHgf9?D++eyop4z=M*2<$VSK~Zu6h#}#gO=|f8iESXFS_p#;C&i#wAcEd zzU)GumzNdh(&?rA(B@-^iUVN!fM{5JLsK&#Mb!$ho2ohfF4`3UhO^@t{io^Q=Z#bh zDcdh}{n4}wLg|Tb!@W_@{Z`yB=(-R%qe3afFh!(|_IMDN(@g|JKTk4n<%#wlPSug- zTt)6aMk*YWcgrl}$ob?zSI{3}n6b|Oj!CpauH)oKQkh69aZMBLzxb)EDA`MmZD#al z0-M-J=3;uNJ(L}9EKA{=HUB0rVG3VTt9)@tX1wulhRR^S*Vr(X$@A~!=O|I>c4C73 zzQ1;+j;c5m;?%3&6txb%CR7}6cd9*d?LRgt-_V=nJf!^ruf$=3lC|kq<2T`@=Fa}; z*Gq)ZO{{eoQ>O6l%G*L$P`@FsYVy*?buAn{SV z1_tVzKR$HnAu8tZ@CDmZ#^jdTW*^T^85gNSnbeh3KZmwrMi;h3Iq_*-1>zUt66ERY zNEyBkR~lIDNrfIuJZYvS{PX9R%r$3*d(^KtZr|`2?Y;+5_DcQO1%QVSXxx6d#M;4& zkd-IN)!z7C`qCI~H6Pi*2oF&^L|ULi!v}>9+7_Vez&e29;F+oY4O9L+$}g+XWlmYt zb_sBfj?mQF1xi*c`)d<*y5Xe&aY{M8+otoMcDSw`Ai=-ChIg$?lxYCoOVDa~5MH+U z)abeEA_$zH8RJG3C_-`J8Qv3>Da_kaL?LSkU557(6vrIL*xrqwtw&tnUKL0`=GXYT zb~Y^o`XsW;LUH#WJ?lUVjapCN&q7?e04A>oJSK&1M0bi(EXB{)i7+Z1fE9sQGWD9XJg0&jK@!3KJ+1h`An3V5Z7rnn?;&G_Fsv?Fk&TCu6F(L zs7S>8vsX!$bl_*>Tx3hLw|--RDd!jjL<7%wTs z<;hnyem4X+=8n4LfvD~(4QBxXlhfJ$QoLq_)GRVe3TC{5+`^9)w_4u@dORXlYwH`v zFj7?sWt!H!u`J-;IE(hvgeuYCUMv?0w+l+bxSp4}V*HC<0TIg=o%8#L+kOvASrViZ zPs7%8cV0{Qx+JW&J|utV*{>7T>s&O9M~c9 zyT;>L##B%q9ot8|m`(cp**!yUPp zOyVqKGQH8S{=Om>Eg1Z~EW5Y#Xwbzwv41aBZiOszew+QUobly%eBgR$RUi z+8DBK{pLTY>bq=kQ%HlgA(q+~l^GJ~OmFPnNONCckC^9LcOiVi`8gU*Ult&LnJmGr zh2jX^7#XQuyt>D4y{a)Vl>brbEz?PyDPHR%GMmheItc*d#CVU_6z+D#Q7?0xJ+i!D zOcTA~%a@kr^0_CTTBvu#o#XMj&(|iSE#RXp*Z{LIQm-wwae_aj6n2wx7y zU_MG3_u71CtvMQv!J}xbvrG}563>eFBRlz?d3m)>y1ZE~=$x=c+G7PCcFO#yg=8@V zo`=_x#y(=B44!Je3_fYT7xKJy<~=|lv0XbFKr;Fx(N&9^pqs|5xEmLJLczhH!OWqH zl?#lrg?nU5-ypa|k|{taW<;EpmqtH=MBOS$(|){*0O#g}m%;78@F?2XUG@y{zW3Rz5zGbO$(0|ru{bq%p5RHyXe$zLFq^-92Pn%CvX=1j_ibFb9t>MBGd8W!$Y5>3 zEgjcE?uYPT%v=U&%^#H5*E=N9ao7A**n_mc3(Jrnn+^ck zR$+e6_$1qgVlc7vkC(0q8vHD+AZ_K&&!1UX7tcYA?|mRw5x-q;L*j}1ld8_qtg<43 ziv=lS78#qxwVWh`6l_1xgW+n>k~@n7o1?0k3g;q6~+VT3sh`yTvYF~$m&O_KumgL%kE=!P=UunY-mvoWFa+g=9e*?J zUb{bVstBL;9FlqnbVKrC>?;(JN-p~}U%|;2@EefQ%VTu$0dD#gs*el4|JQ_OVUm4= zlz$a2PUN8gQYh${aw!8xFCnYxhI`^Hm7;_r8<9mwt`);;!bbh1Bt6Gl6XU07!);gN zc%Ro^rIZAUsp|Y2k%(n~l2=%JcumZyH!3W|$}UD_CpdXJK9Xsz@o}XIeS;~dW{BF@ zYT`v#r07`OJq1l?y_1-V=hJ|$IS(9a3o93!fDhGks9mP}G_IP?ak}#H%%h%#F627` zSpQSSoU-TI{OMTUY8mKx5I`%-!t^S$eK_*l+u@5m5@8qji^l^<+wKu zx?R}R8KaDS2=mAhf3OuGMPWwislES7^pcnD5-FEt!VN;Q``~wivo$2zi7iPu zp%uTTKTjuH8EvVdD=YBjnq=%O`L8cE=yu0N<-OxyxtUWKAn50wJuMJJq#0u}3uGu8 z3jngduE?B?CK*S(+McI0kg6l=A@iI!s7MQ}x`&OHr zEAM^$d}Hk-AU~Rn{WExb_r>r0X(E|?J5HUPTDIq0A_SNPha^!RU7^M$;UG0RjARJn zNX6lE#|RWEdyX0-sZoxu%zOKKLcHm3o%UYZVkarNw~%!?7TtK)%PWY^$mA&gR{i}` z$+`Lz?r1ho6n%yoffe(c<&@PMNpS=H-g&lMzYmyI3FvDLhc6t zM%bN!6pKt7wDv!Zu^bS{)p9h;h^h6dby95@gH29BL}FRM|AFMJrBj>8Dq^njB8+-m zz_xw$z&#H8t(G02Z%~bS{ntjRjKDay6ao;I1KMRXvz6r3$kxMPG(ryfnv#V+rb4-A z#_w1dwq5aqPlv7 z^paB~%@!M@g`_`op5?gveyEN+V|pSM_^pd$P^hZwzTIthx9l|ru1)Re{r zHG;J3BZyMVb!LgbW&|OC*g4YLDzw+ch>x&5L+sCIc%(lDXcK93jHo{t&7rZ-XB-2* z2uKHo{GUPN`>kTg zWxxVF*_rLKjrah*LqPN8=?`-%p^Q<~tWn_}P3&w^j|G(2qj>+JcbX%>KNLkj*)Aj6 z3qyMrL8Iu%^~ogp@KRf(gjL`_9Lbwx3W#-oMpW4i3CkCM9yU65X;=FKtXJAS+U{$Y zo+H1QJS352kY}VrTUoBty0?=ETj)*lTHHW$iV7HmS&1&y*gS$8L;Byo3I4+G=*)1L z070V*Bcl%_VZFEa=kW~UV-Eppaa#nnMjV!IoM+t-HloDL0xF(G62h}N&!M!%d-ws& z7$1%WDS6B|*a9UZlU+358wMSwzES0-vzjMow)~aKnc4e7Jtos(A4{uBm;ZF{hq>)v z_22$8Uv9zT6hTx!QT#M?m4DiVag@s$PQUc6Dfkm(=PdA&jWlK=JS{ zNen$LXlm*G_AJ_~73kTNdWL-4%8!0YG%s`wN4vf4gvCaat-nL>6>#4h!ck5cvXN(Q z5b(}sZDOGF-1$vT?bOZXa#Bj6VhG zTwVYWp;u4`xZU^yanLVYT^m$L?gdx9u7a#)mavxZcN?u&28;yKi_O;;&GVpUW>tQ; zpK<->7AkDxG_mV34QZrBg0aBwh5xcl8$3)LEr+nEpDMW7etZM;bSCGu?tb?VZw6}3 znBnO1<-XGsO{^%X=pVU(uT5 z@ZixK=|HQO237sh^XwIH!&{iJZjvsnm+06#dkJ_2Wrt+jJ{>4oj7!isul#6KmLv!y z8E@KNQI^syH(PR!Hh9`qOfkAHZfaco233w)u-xVruy*L93p!hZmR*$0L~I>H<1A#@ z4lJ=~q;ZTV7KIzZVn;u|oi6EyTWjOsfC;}mn!RQdL^V9`yd)p+yur9(YI}EHdPHw;Ro12)H$IusfK1JsRi>g7Y z@C&dfn0JgCIK$VE^33GcEwJl>W3%A}i4W8)iI7dthOYj|zyDt4+)hnEwhFeSUVl=i z&?@LX`xrYe)e@P&TAwe6@jZZ#Ig;(a;Z(?MAa!KIVJx3`E6wgg>l`2*!p$Vhcp9PG z%0yO(FA%kbw)}fGFkiie)ZKcAw=&e6p$gcYDerbA!GDAYdN2{}ilf&NKXswn(}K zJ5~%1h|&%Vp8_`Ii)@-1sB>9X2UVd=EItm$xF!-x3`mHairJg1N1&%6eNWSgvB>(e zjp53I4f@&h$18m_4kcSmwM9@y^S7n$*0alqMz-fzt$(Qb1@PS4oMPkB(Y_YTyI5~S zEIi6=_oVqaq!9Q?q%v0rR&{CiBUE^1A`YW0?ms@~I?yA!So-6kVc58Xopmil5TM1NSBg0jtspY0n6J-ol}>r z!fil0x)ni0vqm3yq!%eBgk5O1XmuKzj*^p23sj}mT+O5_#AkDg_=v7;5t!YykoY&( z#)AlBZRD4BAStwP$ZJ>Lc}*H*S7sfR)uw8odj;ANecbWeiTL{rjcl7Tg2ntqzKpG| zIimO+dUBzU(S9>Pf#Kj2i$=}Rn2~LX#e^IJl~#Vl3+%YfS~DoJeZMh91rNHDic6wt zi`gkQ|4p6)1H2%FzN~DZRj5!ezFioRa1ti0jMv@ragk~nF9{A-)L2ATd~XOYJ;!z6 zsClAg$Fmkp-1^%e>*c`}`xOMXm=1>qXZ%+t&7R(( zGdh`BMLb|auiV(nhVNbfhEQ#S4DfE!eWw3RehT7$Z^|u5e_dBaP7T{owgAoH^bt;O zukuGN*nL3d7R+DZ%RGZtc{YH&Mgzm5%+syr6;Q-9a=3e-B%*#|@q2(qiwZ0_MMGlY zGv`x2$NseF$lyigSbw3A7=n)6*7;HZJ6q8y`-hAUkk=T;eFZbwO0kXDR1ZLI1hMyu zq~FQdEqz}2rlqI(>iE;oD~>}IyK1*2ebv<Kd^=$4-2Or^tEQG;91AXV97W`DKn1LbVV zMuVqC_?Hmd47XVV$yF-xa>q!*azyM17S>N-XJNpj*>k6EZaKq5VDoFAPZVUH&IkM+_(_$n zSHG`P$dH`@m$R#6VTr`)d9<_UJr|OosHtZA$QB|EhY1LKri;nRc2{RmRq;`G6H?Y& zyxpd*AX6+oxUTW+iegG*$$t;{Zb-6|&f>v)Xp(svN_HjQkZxDh*q!f!Bql=b7|HS2 zrrb}*If(tmE=R`$t%NLdy_sgKDB9hqzFQQM9G~I$*?zpms8UoTkIw%UStvu?`?iSJ z35pN>p9@?HvgI=wY1p~Md#RFN7mI$e-t1MJ3ab|0>UOjt)xm_Vp#~pRg`BIUfcsi4 zZLv())@?YJQEH<(|2HYB=fR@lYZ=zGt*4osB)sIia$me#u_?=ZWX^Rd%>&$bN$Nx7 zxZQbdh^p=|`fpc6_OswMgejE~KY{+~_fSr5?BAYR0m}o@zVrSV&QeN6LxyN3$0 z0^C9Ni;wq`SF4ECf4yaHX=n&0*iHVPn_OEJj(Dz|QRJ`Izgm>?Bmly)MZOJ-WF;o7 zLW5)l1ekMrx_qdKTMnW2B9uv9fh+Zm@t;leGborGmQ!psBEc_F0b}~$eX1mK!p5$U z?vXt?8SFadD5@w#nVLa4-$*(A=R~0bg3#mW6!yyec7|)|e(LC9=o@~77bj+Z-43t~ zK%!dj4rK5vsNRGI!>HukhB^yxl{$1&Lb@EAUqeqBiHsM6ZxGl3TyZXOPxTFP;0+D( z1na{18ezcl(!5CjK=|s+J>rOpLaX?--}{2hDK%i&FqjpD6Le;TI3tM?<&kf~q5S89 zD;zsQsRSyl23KLqu4J|Cui2k!^Iv~w`rdqFSO2AXP=j#;Bne3J z11^HVIWF>xf$le}fjh?KEof!(N7pggSzt`W<{o@BpSN)PDZ>JhmGY;R26cQ(lCW6v z38AMw_F3fLyAoc7lX$2`(_Mef8{K=O;di_B2lS|>mhpos<*qrJ6wU1FXrs+?SBBQ2 zfT~K6LMV_)kjJcESKu`T?G!X5YRE0qDA!nL@u@Xlo`5;_855gNd$VON$v;U7JuG8G zetppe`)ykk5wjQ@Kuo}x%N{3&CQ|)rIvPl*$~{-qI$f*0XHnJK7~jD+>VX^3PEZiO zFdMvVdwr`baQzOUS>}IfDjb-@3SK-mP-)iN3ob?4VDRXq+HJBy`;ym^fk9t{&;No3LMDI!RPomTJ;ekjeH=LB}|jN==M5OsN4o~(NajMS4i;eL6e2U?^=f*>>L7KYtD2|Pa{@tg$? z=Y4mF(lQwBXa)>jbu2nT2cQ54e+C&!N7{`f;IS2K1i_7~*wV`?<9i3$!R7EQX}-ex#D1`;0_ML`5@!LUmioII*CmHl1O^YwgIRsIT- z3dsc0?s!1<6kXm&`bJLOrS2oji3<4$3Jb-DuV;sZ>Q(qHwEZIsiEXI(ZSJnS@2*PH z5T^6Riz^Z`s=3rJMa)eXHd3Btd-QV3^Y9mn?O}(&GCk1Vuu)`0UfKS#cr;{enn@SX zsdFVt{(d7sU?0o!aa|e<%F&N7{A_@aC6p%Z<#%WI57`>VCgRMhbv|E3v#{quN2q;I zccACRYDlu?*!nvwwYRe4GdSVNh_&)JXlP3R9#}Av2FP6OU?TX9!zUs8t8|_uO zX~9fj89huH)-_!mu_cc1s3N(QkEB~^AL-sUHGf-T%&(547P$Xf?6POW1}b?qEX%fu zyT?S!NN6XY9R!C!~7>wmRgV>*hPp^oWhbrwyDQoLoGa z;3QzY-Pd4z2_2W3cdVOg%IH9WM^6&;_W~;_zwPPD3A{4IOrrnOEpy9=ZPjVHQ+}=$ z*b%7o_h(r50KBV`&A}MsV5l`-buj4VovPPcf0=c8(-A_`5GkCNo>p{TzD8+@g?VZp zLk*@QwY62jf(n^n-_8JIgB}cMg4SwYFFoYoqLf(* zY?DY!R!=`OTBbAH&FMifGe7UqvuYsQQ2+C@x3AB)nwQFkQ)u+%OFz>a=+_dBQN^$x zIgH!m$t7f*vLoVMe3gSI_CiY{I_Q^)UCzyLhN7nj3+#rsSNCZaN;;m?HkF<<;)m1r za@5A}JXGuG<+^`u3n4w~_ZqHaqr_Srj2<>K0od^hW;s)iTOG_4i{YE4Af>Cn_)UmJ+}9D+E6S6EXOzG^n2k2&>7$NZ+wy_IuoN zx7_7RCS8v*5-==E_kPk@d4TB&xU`+8S~cqXz9aA^l*Cd1&-3aF^Da)nvpS+OR ztAyW8%&(L<86!RCL2y{U`$K_PjKwrQ=y%qSI7SzZXo>IXKL{lq2#~{=6#sVafP8RJ zOo=$`h_df1S?TS8uQW;+{Key!pEAbYm5vUq6vaZOo8Nq@o0ymTT=~ zI@|kr7_NVRA%kd3C)Mv&T=u1zt7Sf$!7Vjog3!7s?N7a9;T1fjNwP|CbWPYF5~CXE z#$Hqa?Kqkf`~c?d*6`vRyA{w0#X@AGeiatVaj)W}_};~R|G65CV|`#C^b!Nrk&-Uf z@vdGAMw%21_t3#0P?FbPu5vs-+8C*$VwB2!V*Nf2gHheV2@OLW;AYr}JYb^bGs;_v6yjJB25oPU@!x9$o{R z-6x5n%TXzNE_XZ|_0jK8HMa!M!r2W}i;Cch?F`5h|0^pKzm%LxmnI3l_;U zvgaspGO|N~=Jnh)P{|QMv{k|0&?UawQlTKDmC9_~4`V&KcdQ*hlR8Jq^}tGWBHlFaK8c zE)izl4x_pg@L9%`5&x;2{c5dX(^xNiNq`lKj3x=C!VT2KbsZf(Q-`#HPZzRij-$pJ} z=KLCfV4pQrT*uvSx2J5)Be@*H_^A}!B0bdji)rbaQ~!N@5mO6++pip7VzA~qaaM|F z9szGNxR^0y{;vN8W?%&QkaB#C%)RlFxQFy7c?WSED&5}7zxUZ6qwj>_CvY&LZJOVE z+}GewsRl~{dZ5?2)&-bHMqN8)6E`RpJ=|{@sVN;QX-Wa=05hUPTrre%fVEEa6 zLh58~f+dWIw4x^`yuNeliIdtFmU2q)LC~k-Ce}3a*o_fO)Ae9LM-EbZaTov#gS_J6 zAhi=Pd6l|ID~kdUfyTUkjdbG+K8`QBPx;VGZwhb;tPJg)GN^S>(T>JHkn$&BxJgVx z0$riY->aJmB#PJp~L@`EN!#Nmm0V8Wc4N&}!GeUrnbBmW?UV3xM-j7uP!0y2be zASQi3XsAm2_k4p1W7Nk49@qw8VWp%M-S|owQQhaR3Rs@hiB$k(G4hi< z1xwkB%n)_AqLL1HiV{y$gORR_!GN`GbpAaruLH)=%!(2}m}q*ZW)`v-EsTO`MY-H% ze*Y=BIf{8W4>qOG*k+UFj^YFKhJ^ff-G z&+oz!67l-0fXc;cnn`#|puJn`VIwC{YVNp!sd~6YPA580#k3tYFnumE|u^ih9GUO9Mme46}VYy5~WI1vtHJ>t}@kz>?>u!9ebs)Z|97L=;WmIQ@&qrUF;xI{_ zXAJyOXMkHW7E>)Ausg2+FaKCbR}J9SNb~?K;B!p>u%?}}EZIt%kwiu#HyKXuNv-z7 zx{d}@S;c-%3QT#m1eDnL96MU9SAG!~p|`Xt-hd$z-DjZj5F1a~k#l{ZMSR0y(K1kh z*%fsE<1_#KX2XNf#{ujnU_lnAA67ACIa4zsF4Z-WBCU!tS>luO1M8PKmVa@&cil?& zrA~>z*#Ga}8n|D2u$A`EVf9@+1NlY3b&4AK2t>=r>l${z?s~g~BvqaGhwud-wj*eb zS_1y6-keF}Q}??fMXd@hkKagy|BAAY8e(I5?hZ8*0WU)KPUqim7NgZ=Veu?2UvRFU zolRJlW6C|WEKa^(;GK{Ir{#91%0`b?T)Dg9qFu;^tNPz1C;JtTV{JUEzALrm8evf= z=({_|A>ahc4@be2R$HGiz^tVc+fC zc+mM4crqPaZ2*mo>a)@hwWF5qu%948CCLsV%77Iqe+qKsInpD;C%%R_UE&%*$14}% zb}~bOsc@8RR+yr{b?lwmDE%W6cYEF<%$$0KoGYqVjgWS(R2-a(G54`H>x(%RSPgq{ z4T9v8eLHaGmK?Wu?YX0qhn?86PTAyJnYrQqT;06piD8S*4Y9x?cWvfu<@=_#*bEzW-7|Qu{mTD+>?whz!V|z79C-IdfUc zk%R2$Z^s=4Iee%(al*$N7Pi2Mti?*71#ANi6d&fTzF8dhJD$`5n39eExqFBHAw~8I2NBlVErdG2bd+6fIARdR2>mB*ulE#!AkD&Ic|^v{h{^*uru#I z?LVwA3W_YR%}gVIK&B4|H-SnB?i<(NYXh-H`7N!l!d8#Uq9DeX5dJ3;J*~`hDYwOz z1kS|)i)W=7seQA3>gZA;N%j$9KU8KtH!Lszk>*GDQ4JQRM`tmxXASBT3gE}+Ff9es zTvBRjy-yP~Q$F6pi=Te$Onw%ONSzSJ(0A$PkFPi+|693ZZ8VJ{|zmL-U`8MWNXnifgdH!^G-_0`T(xhl8plcv@CL>#r z^_V}9N3x>;-*ctvH9dWq=kL_~zjq*Tuf`_q+aG2AOHjdk?PkY3S4MCkL_|exa}>KE zVAtb*PCkO?FTQm5jphYo*1Ms@pM7m$45}4dsFA51a6#$4q3Eu8S>pupKCr!ARxHi+ z>(zO~^zS@Zb!6zOLLw`L0r!C?mSeAdB&fi`O5;S^+87^eo}AgSEJHZgiJm1!PMHl9Dp- z*~?(~t8k2=deEAcN|>`O6nxzKVk*kwZbIkt|86R~I!(ob~&uPajv`Ikt>VYm@$qvl3#1YB3NNz=0jH>N5!3sVJ+s&RCDg&G;=H z8#DQoW1kQ8+f7zUYwK^-fzC@(5sqaX5x38oW4?vyP!!8Ejq&DDzY5Sfvl`@l&y{H) zszOe{KyM+b`z#~Hq^mL6Te(#Wy?+kXgK@e5bBOK-R+a4lJ^)t}hIka|UOWGHjey_S zR0$43=ojDnzv8YkEXra-sju@kH6-UiS@2{))V)AKNA-Q!%yG@LgsG=x|R7{(jvT6 zCZereuZb&tiYL3_=XCq=Z=mnH-T%oBQabt+WVxwuSLNVEjn3US^@Y_>M)q?unTMH@ z?mOSPuW4CA9(`}9qQ&h}GwqA<{v02M4tZiPo31R4d70_nSngALe(%mSYT3OigSM-! zH`ASiC}`wt%{x-9-X#+ej>v!WsMGZ|=nB!Cmz}OCAHcV$eg1<7ceC5TDLi++LAP4T z3~`XC+Nq2zo{?v)teStHT~9c@jy}Qah37-39m(OL1k;G2(obzZay2SQLoU}Sfl6n+ zruP|7L1GqpKRtLufqXWARkL1;R?_0b^|Uc>!5}CC<@`{gmOusm5valEQ5OFO9@hrp zgxL024Xi!L8Qh_UZS62D7siZt;7*!MMgse2Z?>Ei&f$uMn@=WE+`PJyq8pi8H}Tqr z4Hl_N9vZXA=gsn3kyyz}Nme^Pf}ByJv@^*9y6d)Ri2Io)eLO=naO4KBGY(dJJ&M1@ zlA}vJ(6<|!o9h0z@$iAu2b8p?731JXMO?rI^VjT!#fmfiG$!zHP_~$5a`PoqjsJJ ziQRm2H)}99@E}4=e~qIfi*seY`F{`4F3CVk_cY-$6P!8h-N3lTX*C`mYd)@@eJHw- z=4POv*H?ar!9ypjl(w&MOTFH9B~rvZ&|AUwKH`5l^{}XBrd9I1(u?z$3ce^GC6KgT z2YCWDQdS*dZ%9WLB*8=+u+j8kHKu*vws8Ag`(9bTyuVjV^kQ#t>@GFJxH!(iG@}Bw z6-+y#^Y`}Hg1fw#Stgt!q$Hvv?O8)~d<0$TsVcof^mpWgwLLsxY(Z;mbK$kM0`et* z3;b3AU>5q%LxxWPE)9id5#PxaN8kVa47v^}H>d*4)s z*^_Obo}0JKelz#yNyv7Q|0FS49E1trA zwDb6}S-2obw!RtkbeSf;F#_X#gysQs(26m&pe2tB|C@d2kP)po#pVc$;`82*ls&0$Hj=Zxy22lDP&T8T?{dB*!lx ztZIL>w~-HYMzT*!NrM-~OGpQfV&IlpZ9w4XX=!)^Dx3kGNGylz?>batdGs|n=*%Wx zy{FR8^}UAcD@_cBNR3I%_&!U>yP3~*dO~W*T*cc!J$%CpL?2y-Jv17YY|=u$->yuR zam8f=RTL#V_WRJ#EKo#~Jg9f+7^-~_wh}evs8fn=0o&z*KtY=(>GN{ZM+?WJuWn7a zREA$653Bq8P!0^i*G*$xQsB&rTV&J6*uy9!N3;~6^?K^Fecc3?o*3Nc%Eu+Jok+jf z1mBGRmBd(-v6#t~NC(q0!RDUJE(4_G`y|v554O}iu9X$%pl?%8G$Z!##OZ3g>1 zEoS}2aC+3u>qgB>W2udE$5K5;3;9v3v1BO^0p-bSHc9iXVQkZv9|z#~KkDO^^x(pT z{nb|!327C?a%!C&?OYvX1>{eQ|Go;9`C%8xoFbVbn7_WhK!qHg%*y2^I9HZyRxbDo zY^dMd174zNkSv^n0E6)YNSq{~$N99G=kMeI))>A$2?WPwu_VwXMiC!6F<$`VZp_;+ zL1sQ)I?Mij zCQo8=#XUP|!1+W0{M)7dvct2$k`mUGd;bChL?!;fOYqKmwRrH(%3>>?A(3|!y5-Lz ze|>^?a*mc5pZ|5Fb?SbSpgFl0$hj{=XsXl*`Ze0?eL**0DKs(b}x&r)9W=K8ac`E;w zv;IiksD1gISw+0hH#h6h*N$|dQF)!Ed!SV?OP};i{GxG*7n>58I;zqu_!@dWdtcaT zJo0P8OT%+ngzmWAKq$0?;V%6H zJkaHz0grULbM4Khr~6sH!DYF1a^z(w4j6~j-&=rSOnzRA zH=D-vHfxJSlYJVMVJdNUc0>-Ku<|8pbw-gt98r5U4h6aMnTD1HZQ7l_zurQ1P6!(V zL~3O9xCKnf%yew`I_P9M%8x)}9z=D^ft!{mfD*aPUIEwDJ>+j7i^B=XS1h%^x|aGC zy^w|MBys%3l#kvBdv_BaX_?7>=QIyw@f$WoltxD3Ow_s(Oro!+iQ1(X^q~4M1r*sX zK>hMtI?Uec!|WWioHafA*(+y0N1hA`m#vh=#(mcY`H2{@uETp6yRQcqtPa25>Ra}x zL~eS31cad))br~vw`?(bbp=3{>P&ChE~){!wYM%>YS&bi+aYoe zqUEuAP(6(TdO{73)DJcuQ7ErxDqq6Q8AtMWu&ulgXhZENxQNMZ%bAa`6jLOIH`;%_y>z3i5sfzU=lZc>#=gIR0-#`}7f2zniIlDhOy z01oqIYKZryqZSnH_6bKXXTOF;n4a{cr5sgGin4ZP1#x4zF1`WwRHK%ApW)g!ZK1eS zTMt{4U@R@;ZXv*ni67ik>1Dqt5GAr%lI3%4g&5b9$6Z%bpbHVl5y4DljQ5^fFnS$@ znpXdfQ&Doaj(%;(mT*FtUF?)s#rJs>YM?re^ zX-4=t?KHZfb{5o2nem8Wd0@sQoXQZrez zJiLsHW(4s&1{~7#HPjXu;u^wFB{&?}_rwvTaj3MFTYnz4iu$UeT-`L{rsjdRc`xVp z3oNn{!at!nkwjPA8xo0!b$j!}`(12ps1y9Wk3OI-+DGxLKxuM*aNhuxMj%o^oi=f}ScKAca z5z--S47DQ{cd?NDSVz;CPnn4VbPO%qcKc8y1z?V5d6oFD>(o1N=*Su8xqLsJrfXds zZDsT+5S6CyeW0Qz|85kVY1^hmha{kt*Mt(L^2cpLwAO*eAIK02kdgcqK6R)$X z)w4TR#!e>G)H(GeyVQ2pJ!p^NTG?Lu{9$lPIB7={=Q2~+tq07#$4^ZcLEzItIpDwi z;ELNhzuTZ^hdqbExGsXBZLYV_KZ~Duo`?27*us)3HnVC@CfhBgU+`v%(0W$ySk-{6 zR^7GZv?%GJ=Hyh01b*+1qvo}{mnqJ<0gZNbD0UHb{M@)G_Sb07TM0%3SLr)D3*1=k zauL(cN~>djHq5g`=*k@32vnJq+q#v#hNbgGcdHF|sJOdf@ZcqRzW~D>cf9H~=OWIIkqXati{wngQ>ORLN{PRDY|f zPCPStHx;mAtMhK^jax(NGbKIQxFWarmv;_>JWwmsC+PYvoOQ?>BSC)WddAWhxqE}^ zj#u6(=yIt6x$BJSPLr9*pSePn8hEyj#8+myz7O0lz8UX~xEX-GN%+&8W3~|U&dhOY zADEcmyatezXvs;*NRy`8>(=R5f$0zn#*cxoZn)We8nHSHxEi(b;znlOqn=wG>6#nY*edPk^7O8&8h{CY9^{;l%yn*ZFc0w6chnQl9pz2<3c%g@Ff&7M$(+> zhPWp|O^4PAGB6Zm?ekFe?B(S+Cl2H&!Le?ir5HlZf0hc*O=+^q>j;WxQ&PPDGZc8W zu)*gq0oSbtvTG0P_#vyfbqtO*Eeo%|$BI+rpdlQosU?SR+Wy7Y0H-vYRToDw>{MB5_Ka;!&dJQN!2%PgZ z69>9%yd(j3(BDFI0T(%5EvFnv0JUwAz|C2{#d_I(%N#ZYT(FGd?b)f|GRVSX;TH=h z=PIVFHm~Inv~7_WUg*uFW;q(FEl7zhMQO}ViT7KkfT(R8zHS}v0--cYwWf6+vvzF} zut`Qs)aP0_G*`I{jqg4{U&h?vHMlMsmG}YRX-PpCuWzjO^8L52IrT>zVc7siH3hKj zBp{xG9-5^L>f87LBWV<|i2ocYR0nwoZYvwovf~bm5HSTlk9zwxUY)25-cbgvvmn6H z7$jQmu4oH~-Z?G^8s6r|jBqG3Nehe?`lY##RK)Op*diDt%qPTTET~X<(uDrC9J=lS z=AUBe(mWpXGIMXKcUbA|i6u`JEVGRf;7bO?Q-oDx0QjS@QB`*A5V&Kc0R8O98@%s_ zhP#Mlf#?EPf5~25+C59^43J=)nul5;=rlorAy9vsOuLwQsA|$$OOwo&j#!}wO`etv zwjy!@PT^5gq0;88rC0EA>GLzkxqUV?BhTrAS~uro8!E5pOMmLp!tf>G`E@)+FiV|4 z?1PnMk4HP@4*q!dR$Xe1z#F8FYdh+GQ$K7GB|_iqyx14 zVytRhD$kKs`|D9kL>4Hpl?(NKNjVF!iD9l-1>ODvGT(#f9QC(@o8MpGMlIn@8!&iB z_1+pvR-pn5YM=zuiMgh#OLg0#0R(nlcj zaEn9z9lPjPZvf@xn|(xJzRog#5}k_9^46eN2=Z-z6^a`y5@Sg{`9uBJmulPY{6%Sw z6)p@B`a_duik}GQk%c#Js(tAcSwz*jeS=^(4 zmIYE@h1DIv385pCUvKjo4_xr`5O`&@dNTLkZFkMZ%kBgxOh%~j@Xu*UB!@vd)t9#0 zQ6CpgczDaA6|~cZ5uh5fyy(I)&t=P`HJSfZOQS(bE6Ga#@T-+sk;tSfYueece_-Clw0tml7DE`)BOmt_9 zJXsoIpkC5MI<)=uf{lHEf28#k-hch|SetgZ*p|zkIRt?d@%iC7sh=e+I?0!{KXGOj zsY;db$18g@HShHJ3O&}jpfQ!s>37YzTY^LZ$lT~13#?Ld51`-~^VsHeii`NP5No3d zEhjjFli_e-*9>R9m%{M@l)o1MHvoZ4PB1gfoEt=B^Zym1T}4OjBR%LAkyW)aku37Y z%Sb|xf`tU3WZw}%&+&@1YmfR2rSOgcGtB-2bdeq@xA5t;TwErIV;%1)``Cfhy7bhX z=(=XFyZvueHnE*hxVo+xRG|garSjYpmdktJ9P6c}QL*y**%!+K#IDS$AK0?E+v~ov zFgD9~2_Sv$Hq0h#cYr{e6-fCP(`Ukr=U3vmSC@@o50Lj-c^S9W%4By&9cPYyX$*Hd z{>i)DB|%Q}61|Vq)OctARZDWnkmvmfApJ7S4QQ?8XFSFkTfb@v7p^R* z!uE1h?rCu#mdCPwmf39{u4HUXDqvuhF?a&fS%**N7YY*xe#KtIOB z*G+&rn~*#xXp3_B`(&i;0D~1onYW?a$*6>y>3&Gw9K2igC0`-oPem{bZ!JpVW4SqG zO6f!4pPZZIMAGillg#aXaGqt2YtMj{R?)YCRD6WW!!h%D_AiIwC+E_o0V-L7>l+N@E*ZgM|$?w`Cmu~24A^ed(>h@T`YF-L$t7mzN+pWg_|EN z`@Fb*F;rRaG&*RZhD&_2>r@ek8%%!|vz{Dd6({pkZ1VU7I7A79P&MEk4SE5Dp@ut4 z3z|mYfm6}3^|icba0)M%#6dnr@f$icUVyC{RYkk7b{2mt!!A;`HS+9#{kcLEjo)L$ zY2oT5Bx&A#K6)+L%Ycv8>w@elv1~M;aP?*S2fgl9 z!Pg2&?;LKf_4r*t05P;THHjb8INxfUWp-l87 zo~Z1wz*N!oCFjTQz4$SzFo}AX!odKCpb1=77+2s;51_}Ffvom~i;TLj z5(H)o8Ox*!%6R50rz)b)F;qByTIg_Y6drTl3At1jb(VDk9_uCU0TTzkokEv3W>EVT z6+e&w`S^RE`+76QpT_ts<)NXOMmRE&F-gM1`v7RYEG`ZN00u-YJ1_U&%lC{@`KtXu z*mvp}e;2b^XzF%ZZ)i~jU1&v}{+iCm?=egvfi!*oit=f7FCh8`b8viN@& zy}&5J2RQZ8E`ceB+AimC$N1mBJntGz=<+C_GP{w0* zY2O0n#685;>lf2n*risrdJNP^s8hK-(F%mPj^4>t-}IPJvtvpD-=83*AYoNle|dA&n|}CUVO+)`Saj; zB6k8p3UrU-`-B_@o$IA;RNMl+*`8Lhy|Yb6FyYffajyV&i%@K;ypBW^4Qz;LD?n%1 z1Fa2~Tw4G#Ba34V4M!%uSW($?ef21d%V#`7{3DNQ$j;Jd0S}<}o^++jVh!Lkj^f+? z+*1EJC6jkyJC7#Nh8v7}ewiaE;WXmZ7Enk@h;OR{)#derWvDs|XnqqZwgMy)=BITR zmIa$jIeX^LVA_ixR@{Y6bBMifMS5)AU531*TN=q*6@ zd=fg3gN6L>BL8`bIZwipl~wRY;wr__>)-*$W;ea2^yQ_ z@pJt`|Hty5nZSNZgWjJqY1WrW@*{dpo>~?;{Rp@FZ!?qk8o+oYb^$ECbSHA?>7|1t zxw91fe?CK^Htez6?B;WG{(t-wc%wlUfFyYfdjiDd-@E(Y=HN9zs-=AR;866>KLJzi z4Fed5*A1r7Kc@}cP08SUg)hgYo+UW`b49@w0R~R9Fm3kVMg+ziEAzTZ(CpfO`(7H} zb*M|~dW+xw=A8Y~a9QeU8w4=Qm}L0L@fwtV)OY!xW2IP3%c$F*f1(Wz!=efd;ENDU z9yKcDX)cEU_ONF!0eDk!dt%qVJ1ifyaUb-$4hk&0{%fw&%~|oO2pWUT z(kEH*8DTX!>9^SM8Ije`(A@v`xxuW(Q5k@blP7w!QE7}`!>5?3}yOHjY?vNBDr3ECF?v$>3_}%|~ zabL}6crl!_&)RFR=ULx%QaeE{U7(t6C%A`%t%iZuli4zddC|NQHM*X9w-g~Li5Wet zhuy6TOT(TQ1>-UXSw)#up~lF5o={u6oS+AZ@wJA;>*yc8({{6MS6=Xp1BPv=MfQi{ zgO1r(JmX0`mXAE!nLdw}$3FQ-P+E6+2IeR7$YGp;HQJF>4gqckRgS(h6EF!<2;2`A zCl87mRoJkpS0+OW0ltcX((=&pQ1>HK*xo6=CwgxVRvr2DI%=onb?4*le#0w8gY3YU zIeIll;nZS#3ApVF{a^`eT=m612qy>=QMw!WV3zJ4%p5+c|BCg$?=pVZ3~_=Ga*&^S zgku2IG}(_&wN}!JWfU%Jz%k(SqtFEuHOK_5Z!z%Cn2+`SSI}ZUa%TE`fqpO}FfBGB zjWgcWFzfgKz81dlj}?E^lP5!q(-Bk$rRJLd3rf8V?x%EnB9G&at0e>X<)Tnq0~Dk_&iv6(G_EAD9@bye|CZkm4qO8X z(hV*rH-osC+syx6!dykL#Cy(u!6R+OwTk8y&pP|xb>?_9mVdhaW0=0yQ=yVO__hBH zA*(wn<@1v5q(tIfFMbmxk<0b&Pf_ZJy~}x19Dz^soLAj1aAZD2h)jH~?qr_MmCH6m zjgUo1KoL+}d4UwKpl(y#G62_%Z9}a4IhdIbYsCNG)8dZuix+z7dvm$--*V58B3i7# z!nkP1npb^UxE$MD_qS?3Umw(uFP)Ezb7%=3*Nw2-wI4P)_e~E*KyW?|Co#pO`vmZ? znow{not~B5d<`e`EKnTxTl% zhf0X$SbnD4g4Iz){TSXAHz!XS8&ZaSXKRb{#qp})tamH~Q)Ala+~BD5?&xe8Z+r8o z{n#y%h^^d~UMofT7S!_euSDE+@l$=Yo-i_;YtG)#H8DxjDE7Z_mtckDR+&>H{^NvK z`pCxY=Re3j)~kppELT1#7--qwVcfD@h~bM~+l+CQi6IRgv1wDrh7`$5_RL&Ia&$s? zOqHWujW;x|w667b7*nVv`^zR8GoK!g;f6#>`m&QR)6Jmo`G1??H}{~B5hzZ@z{!xp zW&Gklk3OX2i)unp!7Y;*f*6#-W=+XfB0yroGY>%Izk z-o5IM%P)N$f6~1rVV{BcH{XCBycKZuTWqpr8TY3?xm>hY`bI9hIxVb~94nV+yElfx z-qLOG`ET$Ubdo4-1{-mhkf-<%-n3|URQ|QfX*e1|t{>q0r&9aCLSu1YabX;Rc>|Wj^%x*LK~7D-bl)lH7ZeQdxL1;j zo$>kHy1?of*M(W|6?-EHS0gU(w%CsLG}Cse1>2pz1$PVg+VLiiZXw97jRSL%PMmnge!e;F2dB~a@h4> z0=tm%yN&VpSzv)d$9KrYd&!$kiy zbGp;G^9>Vj$DLdDB2)O!kl5b8itvjXo0A_Jf)13qJc9vW5pB?6y{JRIa!}T|FHm$7 zK6!GLYEm0?r=+P7UuIGwI=cq$yg1G7w*t`<(^h%)3aD||jDkQkT*&%yD~2Lr;5Aa` z)ygCpfmz_jcYDcKrMCf|!NDX1VJRAezxZtz?Zl~D za*Dvy_9S;m^k}3mxA4c#!=cOARUU6#NL<9BbRDV1YNE0R{hDEzXR*$mO@v=kD*wxV zj6n#lc!$_Q{DC(WRs|FBR8=}Vlo|sY`(C@P{h0;ZKO7B|AIsWxR{J@TK6Qf)hN|aa z-V;hzBUW9%`iY?!EIGWx?q3k@yPPOL!H$IVk<=ZvIRYc^p^`W+MHv6Jvw zCq)&8WYV`^cfR4n^3@R6vh?GUgqPdUEvXG<{UNPmXi<9#O_pB3$@w#RDAflUPywnL zs%0=|T=3&M&VgxOR4R&;r~(w}rH162SIbnoCoaa6)yi%q zUFWIqP}!!i>aP)Td|*Wfqa!H7C}X0FQ@|gmcjJWLruUQ{eLEkU`u%CO6W$TEk(zDd zR1F+vp2smEEym3MD@Jtb*FyZhMs!9*`ODU!x)lQ7C@nOjn+|< z>Kn{7`9QEWU)_0I&iE^8a8mCaHqnAgwres~?|ep+JB)t4Mh5>~rp55`uc=uMQmO?P zcS&7yxwMw=*YNL-qRfRyf1Fifp1XDAUHHHA*PUo7WJ1_o_Z z!r9k6oZ0<4OM3xw%EjGLSFBLSj@X|W&FH|dWEW&L{3 zo+3p9Ia#HAAr>d1S6lx_6mMFrG+s!95~JABd22Ktc~y3wKo+KR_h20|D3U8N`S)O@ z!)xm2nv_2eHv>V+HxZ4b+D?zZ!Njz)VZIz59Cd+tU`DuGizqg^pnAmy)xeG!ffBX4 zYA81JZ34!dj~1FO_?WPPq|(#5gEw_is-!7YZ4hTnsqMd^lqtC4K59%sgA`20VD%N4 z{c|yc5st5AE?`_*^^^TVGVTxB9VKn#HDyJ$hgv^G+<2P=mNPg$z->SW`dD)M!-$hI z7V|bJ$$&%naZg9R=$$?{myE;(+n(f--zi1US|*~BO9M$*ywIZ()$GsFbRKhpFA|-% zNDt1R+H1kNaa7ucHHAKRmxKcG4UBQJTLe!&#ziBwB0fy3b5 zff_+rG@iH7YhwjwDh^mbGy*hlMtR1=Fkr_ttSNFcjZLeNQWT_eGUE_zMnz*SIZQkgNQeMWe;X9r`2kH`@+@=4Ty+ z@SsubJ`_ZBtU_!XR@bykf@0nw6EoGn&2j{H;rI*@zsQfply6uwBNC(hgy6eHseRPZ zRvDFtTXRm`=Ichod=+W>;MsSSBs?SxpQgY|LBQAoo zEL9p}H!*>|cO;ryR4_TlQ#u#IYq2t^k{=9K_qGd|3mC%WH()Z-8&B}os$TM%o%~9L z_solnf2)DV8Q4M_bnIh3xBnE9=|0`A8a-sk-Ev0kFv(z^`rP!o%fXjlz6K#*-St6S zbHZWjm`D(Qh(JS@{kPMQ8Rr>yehEEHPd8N(q#5xUOK&-daQks*`_50k+2DG)El%k{ z(^ygZDs4Yo`aRUxlkJ!-Rhs(wB!;Y(!3o|(ul(E4~S6HF5Vnv)nBE7=)Z_))< zuJVCw6@g{#ViHSGB;38X;X5kSMSaC8bU(gY@ksLFIFa{}e>_aRL_)RfwTc6@WbDOw z{l`h_T7L5&ToxFVuN=hC&MyK!5k3F8jso_V_C_%IIB8s5ALCUI+=2?Iw7D0YBekKP z_BeJ$M(cHbj4!4!@byMHMb{gb>LZtKW#5YpGHxV>&ST~wxX^lgz=kZUsY(3f!(Drm z?c(fOe4X@`_rt~9QC=v86G!KDzAM<~l&POnh16B{Cyv;)kz-H!9HR%FI!XF8dB>X% z9{mrGS6#$s-SU}R^Srl|o8j22rvsE6SULsg_^xnakeI@{y|gmSYvt1y${^$Ku582y-f5s;izb$io z`i2`L?DTdSoDpJ;;(=?=O%u}(8!ib>OC;WXQl>vC4^f!T-g$kjN>mY)BrPjVhp z@qFI~AN}^xYvLRDdLyO_Dhs-~>%E1{-UdIFc@VAADWJkD)HnO7@b;}4h3U9No#;M)!U(Amc#C?bId!7sbz zw$^wWxwf494Tf58GaBd2cR;z`em2aqOl%1EHtrm$y;q$3Nq~iKZatdDRpq)ryPy5% z5cZjS+G`D|;btpiBuanf@1TnO%bdc~W{oCX;c^I%wZ?k&Z#7Y)IwHhj;;k)K`;Lp0 zB#{LL0<1kn8=l0cqLYquv0qSgAdbf41>#C8-!=}%r>%OQM}v}|03k)A09{b4;(~L5 z>LL&>^3{$&%>`kwOH@FimEegO?|b*fHJaaaN$l0jQF!!;KHZ;B9oazBo|r|f!816B zbk6DDw*6jUm(rR^dJd5b_g}5Ty9m}inToW3ER+pi3FSh#HlfL0>N`;lc6*qTGQTuu z-`R^=$+)=iAAGnud+Fvo)0r*m1y?j0^Xv#M^{%1pCz@_Dd^}6FOEqvCa<`U_G0z(9 zvHr97wK`=?u2N1tf~i{1>CgJ@f=zX>FOEx$ddpdI!32iV($K%qxG7^-SuTZNG&wT{ zN!5lAdvEa67}7W_V1a%9K^ib3tojdSM)8}#&TbMDxeBBH^x3d@gZWEQCETk0SxD(t z=*7Pa5X{ zX2erNPFzh|q{Jt(Iz7P9`kuQaif4`BnzR*O&^qkR<6OwIEce3kxaJ!n6qZ~SHT6TN4`x%m? zxfv&o9Z!|KAT;?JUNXVPjYp}47L=xAwAA8gf~!8_q_qAUaKm6&A06OV?W>!6Xh=zu2on%0 z7he=CQUZl72zipTI)yczOTL3~+x1%HNat(OGc^4XuYx1t!-i>cTJ|#_En$QQW~jw| z%~>W@udZ(8xRNw>mYO9g6d6;6Z4b20Y?D~9HNqIZJ` zn8*72CP)7H%HPmZZqB!rC|YnlaYpDfK2fhq>n*^W#vy~kNQyO_BpMO9&9b;+VnQ+^ zw}7PG8Y}uRd-nCJV7m0?WKQw&`tIH~26fS1g@@gyLK!%qWUp?vb3*ZqE(QTr5qMLB zvA?|~(v>o>Gkvx!6-667s__u+z{&CLBtYb1MoS4hDU+Ey6nh?U)4uQ!S8t-Om-uYN z!{yq58d;iIV=#>-MzD9;`~0U9dPKY%=7UXsQ(4&8*Bk1mC@fA#kvXrjM2bDe@=Nie zHi;B>!x^$k?qrz{kFACh=%hA+q9t_Bf7i;JmUr)0wW|*Q0Lpi>1qoq#@K#I_B)0Eg zSxBzYuKP>nYQQMtep^**7%&idV_4}8Cu$?Uz`DRbs{ACKsaaBnM^X`cJuYHN`+A6U zR_`EwROk?t|~lnN3QrjM5N8%{kIEqygZEdbb}8Q+{`e_S^) zIqQ-B`EV9#crP^!_*>a5Su^7Ie{ot_$$kD!O5Ogk<1_9B{f_0MFpqwDR;-+!AR_Q7 zFoxJX<7`MYy=Xt%>j)mN6^cX2Uhr3YZHCY#D#!b5=skCmy~RIG7@im{!3AhD$36|A zSlK5G1BA5?C~dkOk-4MS|2vMPkPxYqfrD*`!blCQmtkk;-}$eA z|Bx6b8@JrUJ?sdkAQ~3&jC*^?8A&Pw5%$LusZctMLOC~k0vwCn&!CT9$qr19<&Bp4 z({~%H1WZA40r2d%FR!l(swTWa;S|f1O ze@pWIBXD2Aw=g*%Ly`y08<8S91pJORR3wh+_ zaCs!qvmM|1GZgl(8py0hOpspEBQg#$$gJ^$A-s? zmXE%Fo-$VNe{jLMwPR(|&J^|gK#4DXD7+5199#3J6@>CeQARNA7@}@#mK?rg;c4R_ zZvjR!k!Em=EiBKm&^sIccq6rD)Y{u&rMI(DlM};Lr63kB-I{x@^r+340g+ESR$_0J z0Yiteq0DQ)B(&oxvY1Q^{}&H?rkwO**hEm?A8_98G%*_o9lFn-xA(H&4v8KvTvK%m z{KRY6nk46*M=JZyO2g_+#)^rVn^wP-VdQ^rrhzOseKH4;^j5o7xf!_by!WKLUKM|X zR%9f6o74C~&G+8r!DT)~yB``?7Z!j+VeNrpRX|d!LPlYk5O|9w)fz`BJ}%+YA8=xq zyabnQ{@W3VysLpDt@$e>HzDeGEMO@T$oQR&X_mj^c`kQ?Y^TFzw+mvfVo~?C_m;dj zaLl;c2yQh*QBMoHm89Wu{20f%zXBTt6Q)g=UXAW{i;B$s+tY@6k!yvvFnoDyj-c z%`ZE)Do#yPa!Vq&+h|kk`pjQ_mn%s^_B+hv`h*HaTit=A7Cqu^P@Fv*Ymalp&2dSf znn*x^44r&u00@o7)_c@9yM{pU;otP;TjBT0e@oU%)Wj6ZlV#1w7+YKGK%Uw18ClS-z=It5#`;!07&|{-n}$ z=*Qcu-7ogB_E^DTt`6^>rd1OtiG~dwCQTa(T*%MZ8ZH=XSPL`gC99cq)W!6vzI))f zv?ML%v4dzjUkpNtDshxLVzcalHrJ`7pHt<9Sy`**KBd7|G5q(^k6Kr79?qyuOY$&s zAKisG+ACBK>{kL*IuMlGc<+bCQeQhxXwCDpq_E-u2X=R(l8j{tsIh*V#H~FlTGq{r z-WJg~jolS9;F)GVtV<9b7rn~-=K*v6xPD_X^sc6>Vot#Nr#luqu>h`(=|Id+ksU2h zjOEgjh!zfAu2`|#kM;0Waz|?wH&ZN`(ETxy<0Pu0IJ&+k^}o_+cY~#w5HVS?d?(~h z!qe$=UaN%mz4EU?zr5GN8NSf{{C3&Gb0dYy%^I7DKg!@yWOOrLN~_!n=u;!N^jU&t zBG3q!6@1IDkIqHN=NNMDvRNqnpq^%&W_-iqLFqbd$80BU{vLkZqQa~09jLvg*C072 z!MK6X_9AmVwcdL!2#QfGy)2<`6dg%hNZpgBL(*YcC`U$hd2XBSJSKz}m;NKVt^^ck z7_!UTpXc1iBiV%WY$Xv6ikp!{0`is>X+g;7q?^_QtUkbGC4Dsc&f5f)MU22oG}N_> z2ysZd-|5qH2UHAchr4|I`tEzv?vjZQIRiBV;8N7cHe)JwK0fE%G}X>W8vLh;v4Z0% z{@f>ONgKAGZuiGqQnP9j~wOD*b#y8b<+j;CN6* z%oYoqQ>q$DU?Go=&LR1;Ab)=351;YV&B=9(F?<&t?T9o^$mRV*fS)-Qbl3^zS?; zuXrrST>1!x88Vd~BOR-UQdMVTe`bli0n0s+Rr1jTE*m!Y}64g^Z}{ zfC&W+u&~)Ym~;ON?dP)$e(QF1w7k4CS%7S@rlhO2Gj5U|NXNL?eo&{xo+PggZ~byr z&CBNST_^n!!&twUcG3(xi%vMGM^$}3aMp32%GVoMYo)n9mb21v-bzZ-$yN!M4@z7^()d;n1YU7$7kG2gL2vqWiq(Z%lK$#C4>Og7;n3t+i1 zZh$_+X<_L*aJOcP8aM*eN{S)S#o?FMUoyGhC+n*_T=1Xu(o+ePQ;0aMGY*o}xwka2 zuhw$dH=}SdWh(=#KEzc(ilRPE8acvg4aG9(J`{+*qLHbM7ve*jPe?RQ;(l4bwO^e) zH6FbuUS*9g>adk=sraP$0xGweSdsJ+4v-9V>7|cOonE|qB&$9I>E~I+NT={k3ruQc zSdAr3(A_?URo_G4RiX3%qf6ZTfIpG}cY$-nx3Pp#$K|+gVwAf>3^@lgieWfks7682 z)WWT9C%skuQ$aZG^WIKk(7{{+#ZXliWtsq~A2&TQR-8XQA48Kg@$FedsO)RtAqZY8 zbgxmm#^1&X0Wd=gsP0#K|K82gMJF*&=}m3Mp3hV1@!XTx$WJXU^W+9JR`lKSdSmG4 zKmK@HDBQ{RexG?H^G4O@7$-*@11Pm{q$N%dLy|{~gfH%KiUE70+O>NRt!;S(B9Dl) zqaAh6+$!B6_Yl!rogxy|_JsrvP!G4b-7gS`Z(5Y5?gEXkpI2*P9BaDk`(^NE!IIAg zWuzJwRzh{x`y)|nALs|5#qolhe=8qD8Cb!`rRR--YJukRaqW|KXH27D%Pd+n@{48jk9==MrO01`;uq$F# znM}0(B`FkPRbJbJiKBn2I^tIK;kf>v_S^>zW&KU%K~i}(i^sgv(D@$E7;I&d`0sp4 zFLMTsbI?~UXPkG1qV)oqh(4#ae)+En4CFjLVpFcsfLsoV1I}JWa@0K{VMN6Pi8BH+ z_k#IX^Bw@x0KtKSCL)<#1FHuTWp$Cfw=O`2^t}pj+S$ZQV+TmL<#+HG(?ht-ec~t$m&3vfXf=IbUH6 z)D!&pr?S*bddshpQk`Y*{UT*F0=s-15xwf5H0gIuvOZe4v4GuD%loJ(+Reo?>*u3U z24Qo_eW+KIP$QLf!DTHq4=4Q@O*zBu?oE9uR%x$w-`?>ZfXwGUTL9+Pmb_{7KGT)l=9C_n{D762EkTD~oc zy;$D}{wMI%XzKo3a5fu;Ip69>A+2c5#}ik6p!osR>m;C$IReWrTKZvzKR!0LnHlSk z1fkD}WJ*^+2cZ?8m7n`!>0qOtPnx7ivy`K;Z!}NxIwEf$@eeItuV-$>AKd5UKr4}v z(w1>|$?HNi#G+FJk;Cys2)x%4J^{O5XPmtk@H1%z->^+pd0Mc@$2nnS)Bl$6b3asL zQSq1}A))m77w^(b;tF6fWUGOqi8g6W@NX<5=B~I#6U{nbb@RgMzl>U~cKU1$k_QMJ zc0E1fO?u9hYUFYJTGijX@np*?$EA^_rJhLJY9+NnGO>D()1>dvab{UJ96yPlW~2A8yY2fJuEfP>FQt~uuH#}h;CI_eFGfcHJL)+7&a#oyNOO8-cvu`@ zXfNVkbCgL@xixnBe={c22uQLWB!A{gI6>vX2)cr-GrurKG6krjbtg53ZG}}i?)#{JADL-yvUeS@W83{-pl+>k;*lasy;97- z%_v$CV1B4L-fmxY9Dqt2%flNkl~Mh%VYB$WGy0Hh;(aWOVrE%I(Hve43#zEP;+cu` zgSl!$#tQ4L786`X$fiSblcKF@{u$p8p_h4AbfH zW_#q{X8#AW)blX$;Ij*WVHj1(;IDk?Ax-h%N#

@|`U}HnLG4Zr{JD@>UGf-;5@A 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 OPvep<_L;Ip(EkAGhZ}eR From 878520e6097569d9104c3090d313958533e36515 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 03:32:19 +0000 Subject: [PATCH 06/19] feat(api): update equiv() null handling, add tests BREAKING CHANGE: equiv now treats null & undefined as equal --- packages/api/src/equiv.ts | 4 ++ packages/api/test/index.ts | 89 +++++++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/packages/api/src/equiv.ts b/packages/api/src/equiv.ts index bf1ba3c7bc..ff3bea9827 100644 --- a/packages/api/src/equiv.ts +++ b/packages/api/src/equiv.ts @@ -9,11 +9,15 @@ export function equiv(a, b): boolean { if (typeof a.equiv === "function") { return a.equiv(b); } + } else { + return a == b; } if (b != null) { if (typeof b.equiv === "function") { return b.equiv(a); } + } else { + return a == b; } if (isPlainObject(a) && isPlainObject(b)) { return equivObject(a, b); diff --git a/packages/api/test/index.ts b/packages/api/test/index.ts index be0596bd60..d816508cbb 100644 --- a/packages/api/test/index.ts +++ b/packages/api/test/index.ts @@ -1,3 +1,88 @@ -describe("api", () => { - it("tests pending"); +import * as assert from "assert"; + +import { equiv } from "../src/equiv"; + +describe("equiv", () => { + + it("null", () => { + assert(equiv(null, null)); + assert(equiv(null, undefined)); + assert(equiv(undefined, null)); + }); + + it("boolean", () => { + assert(!equiv(null, false)); + assert(!equiv(false, null)); + assert(!equiv(undefined, false)); + assert(!equiv(false, undefined)); + }); + + it("number", () => { + assert(!equiv(null, 0)); + assert(!equiv(0, null)); + assert(!equiv(0, undefined)); + assert(!equiv(undefined, 0)); + + assert(equiv(0, 0)); + assert(equiv(0, 0.0)); + assert(!equiv(0, 1)); + assert(!equiv(1, 0)); + assert(!equiv(0, "0")); + assert(!equiv("0", 0)); + assert(!equiv(0, [0])); + assert(!equiv([0], 0)); + }); + + it("string", () => { + assert(!equiv(null, "")); + assert(!equiv("", null)); + }); + + it("array", () => { + assert(equiv([], [])); + assert(equiv([], [])); + assert(equiv([], { length: 0 })); + assert(equiv({ length: 0 }, [])); + }); + + it("object", () => { + assert(!equiv(undefined, {})); + assert(!equiv({}, undefined)); + assert(!equiv(null, {})); + assert(!equiv({}, null)); + + assert(equiv({}, {})); + assert(!equiv({}, [])); + assert(!equiv([], {})); + assert(equiv({ a: 0 }, { a: 0 })); + assert(equiv({ a: 0, b: { c: 1 } }, { a: 0, b: { c: 1 } })); + assert(!equiv({ a: 0, b: { c: 1 } }, { a: 0, b: { c: 2 } })); + assert(!equiv({ a: 0, b: { c: 1 } }, { a: 0, b: {} })); + }); + + it("equiv impl", () => { + class A { + a: any; + constructor(a) { + this.a = a; + } + + equiv(b) { + return equiv(this.a, b); + } + } + + assert(!equiv(new A(1), null)); + assert(!equiv(new A(1), undefined)); + assert(!equiv(null, new A(1))); + assert(!equiv(undefined, new A(1))); + assert(equiv(new A(1), new A(1))); + assert(equiv(new A(1), 1)); + assert(equiv(1, new A(1))); + assert(equiv(1, { equiv(x) { return x === 1; } })); + assert(equiv({ equiv(x) { return x === 1; } }, 1)); + assert(!equiv(new A(1), new A(2))); + assert(!equiv(new A(1), 2)); + }); + }); From 1354e298089cf5372c26c26352d59d642548447e Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 06:15:14 +0000 Subject: [PATCH 07/19] fix(api): fix equiv string handling, update tests --- packages/api/src/equiv.ts | 4 ++++ packages/api/test/index.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/api/src/equiv.ts b/packages/api/src/equiv.ts index ff3bea9827..c54901aedd 100644 --- a/packages/api/src/equiv.ts +++ b/packages/api/src/equiv.ts @@ -1,5 +1,6 @@ import { isArrayLike } from "@thi.ng/checks/is-arraylike"; import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { isString } from "@thi.ng/checks/is-string"; export function equiv(a, b): boolean { if (a === b) { @@ -19,6 +20,9 @@ export function equiv(a, b): boolean { } else { return a == b; } + if (isString(a) || isString(b)) { + return a === b; + } if (isPlainObject(a) && isPlainObject(b)) { return equivObject(a, b); } diff --git a/packages/api/test/index.ts b/packages/api/test/index.ts index d816508cbb..44bcb98123 100644 --- a/packages/api/test/index.ts +++ b/packages/api/test/index.ts @@ -36,6 +36,8 @@ describe("equiv", () => { it("string", () => { assert(!equiv(null, "")); assert(!equiv("", null)); + assert(equiv("a", "a")); + assert(!equiv("a", "ab")); }); it("array", () => { @@ -43,6 +45,8 @@ describe("equiv", () => { assert(equiv([], [])); assert(equiv([], { length: 0 })); assert(equiv({ length: 0 }, [])); + assert(equiv(["a"], ["a"])); + assert(!equiv(["a"], ["b"])); }); it("object", () => { From ea638bef49ae0ca910c7dd24c53971394227846a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 06:17:01 +0000 Subject: [PATCH 08/19] feat(rstream): add Cache subscription class --- packages/rstream/src/index.ts | 1 + packages/rstream/src/subs/cache.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 packages/rstream/src/subs/cache.ts diff --git a/packages/rstream/src/index.ts b/packages/rstream/src/index.ts index 6f9176cdf2..1cb1d9416b 100644 --- a/packages/rstream/src/index.ts +++ b/packages/rstream/src/index.ts @@ -13,6 +13,7 @@ export * from "./from/raf"; export * from "./from/worker"; export * from "./subs/bisect"; +export * from "./subs/cache"; export * from "./subs/post-worker"; export * from "./subs/resolve"; export * from "./subs/sidechain-partition"; diff --git a/packages/rstream/src/subs/cache.ts b/packages/rstream/src/subs/cache.ts new file mode 100644 index 0000000000..b1815167f4 --- /dev/null +++ b/packages/rstream/src/subs/cache.ts @@ -0,0 +1,27 @@ +import { IDeref } from "@thi.ng/api/api"; +import { Transducer } from "@thi.ng/transducers/api"; + +import { Subscription } from "../subscription"; + +export class Cache extends Subscription implements + IDeref { + + value: T; + + constructor(xf?: Transducer, id?: string) { + super(null, xf, null, id || `cache-${Subscription.NEXT_ID++}`); + } + + deref(): T { + return this.value; + } + + dispatch(x: T) { + this.value = x; + super.dispatch(x); + } +} + +export function cache(xf?: Transducer, id?: string) { + return new Cache(xf, id); +} From a580f722e3150f862e51098cbf8ff9ab852a74cc Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 15:07:16 +0000 Subject: [PATCH 09/19] build: update deps (typescript & typedoc) --- packages/api/package.json | 6 +++--- packages/atom/package.json | 6 +++--- packages/bitstream/package.json | 6 +++--- packages/checks/package.json | 6 +++--- packages/csp/package.json | 6 +++--- packages/dcons/package.json | 6 +++--- packages/iterators/package.json | 6 +++--- packages/rle-pack/package.json | 6 +++--- packages/rstream-csp/package.json | 6 +++--- packages/rstream-log/package.json | 6 +++--- packages/rstream/package.json | 6 +++--- packages/transducers/package.json | 6 +++--- packages/unionstruct/package.json | 6 +++--- scripts/make-module | 4 ++-- 14 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 4e0a229a2f..099cce2a3f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -37,4 +37,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/atom/package.json b/packages/atom/package.json index 072a258031..aa172ec458 100644 --- a/packages/atom/package.json +++ b/packages/atom/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -35,4 +35,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/bitstream/package.json b/packages/bitstream/package.json index 36cd148526..2deda27950 100644 --- a/packages/bitstream/package.json +++ b/packages/bitstream/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "keywords": [ @@ -36,4 +36,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/checks/package.json b/packages/checks/package.json index f2d09931be..4b7ed8625e 100644 --- a/packages/checks/package.json +++ b/packages/checks/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "keywords": [ @@ -36,4 +36,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/csp/package.json b/packages/csp/package.json index 73427313e0..e6cae34523 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -25,8 +25,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -47,4 +47,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/dcons/package.json b/packages/dcons/package.json index ec4f001e14..1668cd54ac 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -41,4 +41,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/iterators/package.json b/packages/iterators/package.json index ab5cdc7d7a..cb4acf4949 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -42,4 +42,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/rle-pack/package.json b/packages/rle-pack/package.json index ff9cd8eef1..1afec08824 100644 --- a/packages/rle-pack/package.json +++ b/packages/rle-pack/package.json @@ -22,8 +22,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 7713b781ed..938adff4b3 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index 07a29c7066..fb057669fb 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/rstream/package.json b/packages/rstream/package.json index 25bbacf19a..f2e5937d43 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -44,4 +44,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/transducers/package.json b/packages/transducers/package.json index a85fc6b9ee..b2a73e2a43 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { @@ -41,4 +41,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/unionstruct/package.json b/packages/unionstruct/package.json index 40bab02424..5557096719 100644 --- a/packages/unionstruct/package.json +++ b/packages/unionstruct/package.json @@ -21,8 +21,8 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "keywords": [ @@ -39,4 +39,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/scripts/make-module b/scripts/make-module index 0c9c09f224..376e209b7f 100755 --- a/scripts/make-module +++ b/scripts/make-module @@ -48,8 +48,8 @@ cat << EOF > $MODULE/package.json "@types/node": "^9.3.0", "mocha": "^5.0.0", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, "dependencies": { From febe39f1294e3225b9ea89e68c5a99fd7f77bc10 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 15:09:20 +0000 Subject: [PATCH 10/19] fix(transducers): update comp() for typescript 2.7.* --- packages/transducers/src/func/comp.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/transducers/src/func/comp.ts b/packages/transducers/src/func/comp.ts index 3459a042a9..b2ad422a4d 100644 --- a/packages/transducers/src/func/comp.ts +++ b/packages/transducers/src/func/comp.ts @@ -37,7 +37,8 @@ export function comp(...fns: ((x: any) => any)[]) { case 10: default: let ff = (x) => a(b(c(d(e(f(g(h(i(j(x)))))))))); - return fns.length === 10 ? ff : comp(ff, ...fns.slice(10)); + // TODO TS2.7.* complains about args here? + return fns.length === 10 ? ff : (comp)(ff, ...fns.slice(10)); } } From 0439d24b26dfeff666989afca74f19d843e9efe0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 15:17:06 +0000 Subject: [PATCH 11/19] refactor(hiccup): update/add deps, restructure/split into sub-modules --- packages/hiccup/package.json | 9 +- packages/hiccup/src/api.ts | 23 ++++ packages/hiccup/src/css.ts | 9 ++ packages/hiccup/src/escape.ts | 3 + packages/hiccup/src/index.ts | 221 +------------------------------ packages/hiccup/src/serialize.ts | 181 +++++++++++++++++++++++++ 6 files changed, 226 insertions(+), 220 deletions(-) create mode 100644 packages/hiccup/src/api.ts create mode 100644 packages/hiccup/src/css.ts create mode 100644 packages/hiccup/src/escape.ts create mode 100644 packages/hiccup/src/serialize.ts diff --git a/packages/hiccup/package.json b/packages/hiccup/package.json index a27e76abe0..769572d208 100644 --- a/packages/hiccup/package.json +++ b/packages/hiccup/package.json @@ -21,10 +21,13 @@ "mocha": "^5.0.0", "nyc": "^11.4.1", "ts-loader": "^3.3.1", - "typedoc": "^0.9.0", - "typescript": "^2.6.2", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", "webpack": "^3.10.0" }, + "dependencies": { + "@thi.ng/checks": "^1.1.4" + }, "keywords": [ "ES6", "clojure", @@ -42,4 +45,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/hiccup/src/api.ts b/packages/hiccup/src/api.ts new file mode 100644 index 0000000000..e151254f27 --- /dev/null +++ b/packages/hiccup/src/api.ts @@ -0,0 +1,23 @@ +export const SVG_NS = "http://www.w3.org/2000/svg"; + +export const TAG_REGEXP = /^([^\s\.#]+)(?:#([^\s\.#]+))?(?:\.([^\s#]+))?$/; + +// tslint:disable-next-line +export const SVG_TAGS = "svg circle clipPath defs ellipse g line linearGradient mask path pattern polygon polyline radialGradient rect stop symbol text" + .split(" ") + .reduce((acc, x) => (acc[x] = 1, acc), {}); + +// tslint:disable-next-line +export const VOID_TAGS = "area base br col command embed hr img input keygen link meta param source track wbr circle ellipse line path polygon polyline rect stop" + .split(" ") + .reduce((acc, x) => (acc[x] = 1, acc), {}); + +export const ENTITIES = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", +}; + +export const ENTITY_RE = new RegExp(`[${Object.keys(ENTITIES)}]`, "g"); diff --git a/packages/hiccup/src/css.ts b/packages/hiccup/src/css.ts new file mode 100644 index 0000000000..2ee2301497 --- /dev/null +++ b/packages/hiccup/src/css.ts @@ -0,0 +1,9 @@ +export const css = (rules: any) => { + const css = []; + for (let r in rules) { + if (rules.hasOwnProperty(r)) { + css.push(r + ":" + rules[r] + ";"); + } + } + return css.join(""); +}; diff --git a/packages/hiccup/src/escape.ts b/packages/hiccup/src/escape.ts new file mode 100644 index 0000000000..8ce103848c --- /dev/null +++ b/packages/hiccup/src/escape.ts @@ -0,0 +1,3 @@ +import { ENTITY_RE, ENTITIES } from "./api"; + +export const escape = (x: string) => x.replace(ENTITY_RE, (y) => ENTITIES[y]); diff --git a/packages/hiccup/src/index.ts b/packages/hiccup/src/index.ts index 9e31222b8c..cebec3c0cd 100644 --- a/packages/hiccup/src/index.ts +++ b/packages/hiccup/src/index.ts @@ -1,217 +1,4 @@ -export const SVG_NS = "http://www.w3.org/2000/svg"; - -const TAG_REGEXP = /^([^\s\.#]+)(?:#([^\s\.#]+))?(?:\.([^\s#]+))?$/; - -// tslint:disable-next-line -// const SVG_REGEXP = /^(svg|circle|clipPath|defs|ellipse|g|line|linearGradient|mask|path|pattern|polygon|polyline|radialGradient|rect|stop|symbol|text)$/; - -// tslint:disable-next-line -const VOID_TAGS = [ - "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr", - "circle", "ellipse", "line", "path", "polygon", "polyline", "rect", "stop" -].reduce((acc, x) => (acc[x] = 1, acc), {}); - -const ENTITIES = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", -}; - -const ENTITY_RE = new RegExp(`[${Object.keys(ENTITIES)}]`, "g"); - -/** - * Recursively normalizes and serializes given tree as HTML/SVG/XML string. - * Expands any embedded component functions with their results. Each node of the - * input tree can have one of the following input forms: - * - * ```js - * ["tag", ...] - * ["tag#id.class1.class2", ...] - * ["tag", {other: "attrib"}, ...] - * ["tag", {...}, "body", function, ...] - * [function, arg1, arg2, ...] - * [iterable] - * ``` - * - * Tags can be defined in "Zencoding" convention, e.g. - * - * ```js - * ["div#foo.bar.baz", "hi"] //

hi
- * ``` - * - * The presence of the attributes object (2nd array index) is optional. - * Any attribute values, incl. functions are allowed. If the latter, - * the function is called with the full attribs object as argument and - * MUST return a string. This allows for the dynamic creation of attrib - * values based on other attribs. - * - * ```js - * ["div#foo", {bar: (attribs) => attribs.id + "-bar"}] - * //
- * ``` - * - * The `style` attribute can ONLY be defined as string or object. - * - * ```js - * ["div", {style: {color: "red", background: "#000"}}] - * //
- * ``` - * - * Boolean attribs are serialized in HTML5 syntax (present or not). - * `null` or empty string attrib values are ignored. - * - * Any `null` or `undefined` array values (other than in head position) - * will be removed, unless a function is in head position. - * - * A function in head position of a node acts as composition & delayed - * execution mechanism and the function will only be executed at - * serialization time. In this case all other elements of that node / - * array are passed as arguments when that function is called. - * The return value the function MUST be a valid new tree - * (or `undefined`). - * - * ```js - * const foo = (a, b) => ["div#" + a, b]; - * - * [foo, "id", "body"] //
body
- * ``` - * - * Functions located in other positions are called **without** args - * and can return any (serializable) value (i.e. new trees, strings, - * numbers, iterables or any type with a suitable `.toString()` - * implementation). - * - * @param tree elements / component tree - * @param escape auto-escape entities - */ -const serialize = (tree: any[], escape = false) => _serialize(tree, escape); - -const _serialize = (tree: any, esc: boolean) => { - if (tree == null) { - return ""; - } - if (Array.isArray(tree)) { - if (!tree.length) { - return ""; - } - let tag = tree[0]; - if (fn(tag)) { - return _serialize(tag.apply(null, tree.slice(1)), esc); - } - if (str(tag)) { - tree = normalize(tree); - tag = tree[0]; - let attribs = tree[1], - body = tree[2], - res = `<${tag}`; - for (let a in attribs) { - if (attribs.hasOwnProperty(a)) { - let v = attribs[a]; - if (v != null) { - if (fn(v)) { - if ((v = v(attribs)) == null) { - continue; - } - } - if (v === true) { - res += " " + a; - } else if (v !== false) { - v = v.toString(); - if (v.length) { - res += ` ${a}="${esc ? escape(v) : v}"`; - } - } - } - } - } - if (body) { - if (VOID_TAGS[tag]) { - throw new Error(`No body allowed in tag: ${tag}`); - } - res += ">"; - for (let i = 0, n = body.length; i < n; i++) { - res += _serialize(body[i], esc); - } - return res += ``; - } else if (!VOID_TAGS[tag]) { - return res += `>`; - } - return res += "/>"; - } - if (iter(tree)) { - return _serializeIter(tree, esc); - } - throw new Error(`invalid tree node: ${tree}`); - } - if (fn(tree)) { - return _serialize(tree(), esc); - } - if (iter(tree)) { - return _serializeIter(tree, esc); - } - return esc ? escape(tree.toString()) : tree; -}; - -const _serializeIter = (iter: Iterable, esc: boolean) => { - const res = []; - for (let i of iter) { - res.push(_serialize(i, esc)); - } - return res.join(""); -} - -const normalize = (tag: any[]) => { - let el = tag[0], match, id, clazz; - const attribs: any = {}; - if (!str(el) || !(match = TAG_REGEXP.exec(el))) { - throw new Error(`"${el}" is not a valid tag name`); - } - el = match[1]; - id = match[2]; - clazz = match[3]; - if (id) { - attribs.id = id; - } - if (clazz) { - attribs.class = clazz.replace(/\./g, " "); - } - if (tag.length > 1) { - let i = 1; - if (obj(tag[1])) { - Object.assign(attribs, tag[1]); - i++; - } - if (obj(attribs.style)) { - attribs.style = css(attribs.style); - } - tag = tag.slice(i).filter((x) => x != null); - if (tag.length > 0) { - return [el, attribs, tag]; - } - } - return [el, attribs]; -}; - -const css = (rules: any) => { - const css = []; - for (let r in rules) { - if (rules.hasOwnProperty(r)) { - css.push(r + ":" + rules[r] + ";"); - } - } - return css.join(""); -}; - -const obj = (x) => Object.prototype.toString.call(x) === "[object Object]"; -const fn = (x) => typeof x === "function"; -const str = (x) => typeof x === "string"; -const iter = (x) => !str(x) && x[Symbol.iterator] !== undefined; - -const escape = (x: string) => x.replace(ENTITY_RE, (y) => ENTITIES[y]); - -export { - serialize, - escape, -}; +export * from "./api"; +export * from "./css"; +export * from "./escape"; +export * from "./serialize"; diff --git a/packages/hiccup/src/serialize.ts b/packages/hiccup/src/serialize.ts new file mode 100644 index 0000000000..76861bc9f3 --- /dev/null +++ b/packages/hiccup/src/serialize.ts @@ -0,0 +1,181 @@ +import { isPlainObject } from "@thi.ng/checks/is-plain-object"; +import { isFunction } from "@thi.ng/checks/is-function"; +import { isString } from "@thi.ng/checks/is-string"; + +import { TAG_REGEXP, VOID_TAGS } from "./api"; +import { css } from "./css"; + +/** + * Recursively normalizes and serializes given tree as HTML/SVG/XML string. + * Expands any embedded component functions with their results. Each node of the + * input tree can have one of the following input forms: + * + * ```js + * ["tag", ...] + * ["tag#id.class1.class2", ...] + * ["tag", {other: "attrib"}, ...] + * ["tag", {...}, "body", function, ...] + * [function, arg1, arg2, ...] + * [iterable] + * ``` + * + * Tags can be defined in "Zencoding" convention, e.g. + * + * ```js + * ["div#foo.bar.baz", "hi"] //
hi
+ * ``` + * + * The presence of the attributes object (2nd array index) is optional. + * Any attribute values, incl. functions are allowed. If the latter, + * the function is called with the full attribs object as argument and + * MUST return a string. This allows for the dynamic creation of attrib + * values based on other attribs. + * + * ```js + * ["div#foo", {bar: (attribs) => attribs.id + "-bar"}] + * //
+ * ``` + * + * The `style` attribute can ONLY be defined as string or object. + * + * ```js + * ["div", {style: {color: "red", background: "#000"}}] + * //
+ * ``` + * + * Boolean attribs are serialized in HTML5 syntax (present or not). + * `null` or empty string attrib values are ignored. + * + * Any `null` or `undefined` array values (other than in head position) + * will be removed, unless a function is in head position. + * + * A function in head position of a node acts as composition & delayed + * execution mechanism and the function will only be executed at + * serialization time. In this case all other elements of that node / + * array are passed as arguments when that function is called. + * The return value the function MUST be a valid new tree + * (or `undefined`). + * + * ```js + * const foo = (a, b) => ["div#" + a, b]; + * + * [foo, "id", "body"] //
body
+ * ``` + * + * Functions located in other positions are called **without** args + * and can return any (serializable) value (i.e. new trees, strings, + * numbers, iterables or any type with a suitable `.toString()` + * implementation). + * + * @param tree elements / component tree + * @param escape auto-escape entities + */ +export const serialize = (tree: any[], escape = false) => _serialize(tree, escape); + +const _serialize = (tree: any, esc: boolean) => { + if (tree == null) { + return ""; + } + if (Array.isArray(tree)) { + if (!tree.length) { + return ""; + } + let tag = tree[0]; + if (isFunction(tag)) { + return _serialize(tag.apply(null, tree.slice(1)), esc); + } + if (isString(tag)) { + tree = normalize(tree); + tag = tree[0]; + let attribs = tree[1], + body = tree[2], + res = `<${tag}`; + for (let a in attribs) { + if (attribs.hasOwnProperty(a)) { + let v = attribs[a]; + if (v != null) { + if (isFunction(v)) { + if ((v = v(attribs)) == null) { + continue; + } + } + if (v === true) { + res += " " + a; + } else if (v !== false) { + v = v.toString(); + if (v.length) { + res += ` ${a}="${esc ? escape(v) : v}"`; + } + } + } + } + } + if (body) { + if (VOID_TAGS[tag]) { + throw new Error(`No body allowed in tag: ${tag}`); + } + res += ">"; + for (let i = 0, n = body.length; i < n; i++) { + res += _serialize(body[i], esc); + } + return res += ``; + } else if (!VOID_TAGS[tag]) { + return res += `>`; + } + return res += "/>"; + } + if (iter(tree)) { + return _serializeIter(tree, esc); + } + throw new Error(`invalid tree node: ${tree}`); + } + if (isFunction(tree)) { + return _serialize(tree(), esc); + } + if (iter(tree)) { + return _serializeIter(tree, esc); + } + return esc ? escape(tree.toString()) : tree; +}; + +const _serializeIter = (iter: Iterable, esc: boolean) => { + const res = []; + for (let i of iter) { + res.push(_serialize(i, esc)); + } + return res.join(""); +} + +const normalize = (tag: any[]) => { + let el = tag[0], match, id, clazz; + const attribs: any = {}; + if (!isString(el) || !(match = TAG_REGEXP.exec(el))) { + throw new Error(`"${el}" is not a valid tag name`); + } + el = match[1]; + id = match[2]; + clazz = match[3]; + if (id) { + attribs.id = id; + } + if (clazz) { + attribs.class = clazz.replace(/\./g, " "); + } + if (tag.length > 1) { + let i = 1; + if (isPlainObject(tag[1])) { + Object.assign(attribs, tag[1]); + i++; + } + if (isPlainObject(attribs.style)) { + attribs.style = css(attribs.style); + } + tag = tag.slice(i).filter((x) => x != null); + if (tag.length > 0) { + return [el, attribs, tag]; + } + } + return [el, attribs]; +}; + +const iter = (x) => !isString(x) && x[Symbol.iterator] !== undefined; From 4d0d437b4b71075f995431109e773175bb2eaf19 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 15:18:35 +0000 Subject: [PATCH 12/19] feat(diff): re-import diff package (MBP2010) --- packages/diff/.npmignore | 9 ++ packages/diff/LICENSE | 201 +++++++++++++++++++++++++++++++ packages/diff/README.md | 28 +++++ packages/diff/package.json | 36 ++++++ packages/diff/src/api.ts | 28 +++++ packages/diff/src/array.ts | 104 ++++++++++++++++ packages/diff/src/index.ts | 3 + packages/diff/src/object.ts | 26 ++++ packages/diff/test/index.ts | 7 ++ packages/diff/test/tsconfig.json | 10 ++ packages/diff/tsconfig.json | 9 ++ 11 files changed, 461 insertions(+) create mode 100644 packages/diff/.npmignore create mode 100644 packages/diff/LICENSE create mode 100644 packages/diff/README.md create mode 100644 packages/diff/package.json create mode 100644 packages/diff/src/api.ts create mode 100644 packages/diff/src/array.ts create mode 100644 packages/diff/src/index.ts create mode 100644 packages/diff/src/object.ts create mode 100644 packages/diff/test/index.ts create mode 100644 packages/diff/test/tsconfig.json create mode 100644 packages/diff/tsconfig.json diff --git a/packages/diff/.npmignore b/packages/diff/.npmignore new file mode 100644 index 0000000000..478163840f --- /dev/null +++ b/packages/diff/.npmignore @@ -0,0 +1,9 @@ +build +coverage +dev +doc +src* +test +.nyc_output +*.tgz +*.html diff --git a/packages/diff/LICENSE b/packages/diff/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/diff/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/diff/README.md b/packages/diff/README.md new file mode 100644 index 0000000000..1f5a9de4e5 --- /dev/null +++ b/packages/diff/README.md @@ -0,0 +1,28 @@ +# @thi.ng/diff + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/diff.svg)](https://www.npmjs.com/package/@thi.ng/diff) + +## About + +TODO... + +## Installation + +``` +yarn add @thi.ng/diff +``` + +## Usage examples + +```typescript +import * as diff from "@thi.ng/diff"; + +``` + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/diff/package.json b/packages/diff/package.json new file mode 100644 index 0000000000..ca62efbcff --- /dev/null +++ b/packages/diff/package.json @@ -0,0 +1,36 @@ +{ + "name": "@thi.ng/diff", + "version": "0.0.1", + "description": "TODO", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": "https://github.com/thi-ng/umbrella", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts build doc", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^2.2.46", + "@types/node": "^9.3.0", + "mocha": "^5.0.0", + "ts-loader": "^3.3.1", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", + "webpack": "^3.10.0" + }, + "dependencies": { + "@thi.ng/api": "^1.5.0" + }, + "keywords": [ + "ES6", + "typescript" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/diff/src/api.ts b/packages/diff/src/api.ts new file mode 100644 index 0000000000..2dbccdd600 --- /dev/null +++ b/packages/diff/src/api.ts @@ -0,0 +1,28 @@ +export interface DiffLogPair extends Array { + [0]: number; + [1]: any; +} + +export interface DiffLogEntry extends Array { + [0]: number; + [1]: DiffLogPair; +} + +export interface DiffKeyMap { + [id: number]: any; +} + +export interface ArrayDiff { + distance: number; + adds: DiffKeyMap; + dels: DiffKeyMap; + const: DiffKeyMap; + linear: DiffLogEntry[]; +} + +export interface ObjectDiff { + distance: number; + adds: string[]; + dels: string[]; + edits: [PropertyKey, any]; +} diff --git a/packages/diff/src/array.ts b/packages/diff/src/array.ts new file mode 100644 index 0000000000..5660821e19 --- /dev/null +++ b/packages/diff/src/array.ts @@ -0,0 +1,104 @@ +import { equiv } from "@thi.ng/api/equiv"; + +import { ArrayDiff } from "./api"; + +/** + * Based on "An O(NP) Sequence Comparison Algorithm"" + * by Wu, Manber, Myers and Miller + * + * http://www.itu.dk/stud/speciale/bepjea/xwebtex/litt/an-onp-sequence-comparison-algorithm.pdf + * https://github.com/cubicdaiya/onp + * + * Various optimizations, fixes & refactorings. + * Uses `equiv` for equality checks. + */ +export function diffArray(_a, _b) { + const state = { + distance: 0, + adds: {}, + dels: {}, + const: {}, + linear: [] + }; + const reverse = _a.length >= _b.length, + adds = state[reverse ? "dels" : "adds"], + dels = state[reverse ? "adds" : "dels"], + aID = reverse ? -1 : 1, + dID = reverse ? 1 : -1; + let a, b, na, nb; + + if (reverse) { + a = _b; + b = _a; + } else { + a = _a; + b = _b; + } + na = a.length; + nb = b.length; + + const offset = na + 1, + delta = nb - na, + doff = delta + offset, + size = na + nb + 3, + path = new Array(size).fill(-1), + fp = new Array(size).fill(-1), + epc = [], + pathPos = []; + + function snake(k, p, pp) { + const koff = k + offset, + r = path[koff + ((p > pp) ? -1 : 1)]; + let y = p > pp ? p : pp, + x = y - k; + while (x < na && y < nb && equiv(a[x], b[y])) { + x++; + y++; + } + path[koff] = pathPos.length; + pathPos.push([x, y, r]); + return y; + } + + let p = -1, pp; + do { + p++; + for (let k = -p, ko = k + offset; k < delta; k++ , ko++) { + fp[ko] = snake(k, fp[ko - 1] + 1, fp[ko + 1]); + } + for (let k = delta + p, ko = k + offset; k > delta; k-- , ko--) { + fp[ko] = snake(k, fp[ko - 1] + 1, fp[ko + 1]); + } + fp[doff] = snake(delta, fp[doff - 1] + 1, fp[doff + 1]); + } while (fp[doff] !== nb); + state.distance = delta + 2 * p; + + let r = path[doff]; + while (r !== -1) { + epc.push(pp = pathPos[r]); + r = pp[2]; + } + + for (let i = epc.length - 1, px = 0, py = 0; i >= 0; i--) { + const e = epc[i]; + let v; + while (px < e[0] || py < e[1]) { + const d = e[1] - e[0]; + if (d > py - px) { + adds[py] = v = b[py]; + state.linear.push([aID, [py, v]]); + py++; + } else if (d < py - px) { + dels[px] = v = a[px]; + state.linear.push([dID, [px, v]]); + px++; + } else { + state.const[px] = v = a[px]; + state.linear.push([0, [px, v]]); + px++; + py++; + } + } + } + return state; +} diff --git a/packages/diff/src/index.ts b/packages/diff/src/index.ts new file mode 100644 index 0000000000..ac723d9b1a --- /dev/null +++ b/packages/diff/src/index.ts @@ -0,0 +1,3 @@ +export * from "./api"; +export * from "./array"; +export * from "./object"; diff --git a/packages/diff/src/object.ts b/packages/diff/src/object.ts new file mode 100644 index 0000000000..9f81b227ab --- /dev/null +++ b/packages/diff/src/object.ts @@ -0,0 +1,26 @@ +import { equiv } from "@thi.ng/api/equiv"; + +import { ObjectDiff } from "./api"; + +export function diffObject(a: any, b: any) { + const adds = [], + dels = [], + edits = [], + keys = new Set(Object.keys(a).concat(Object.keys(b))); + let distance = 0; + for (let k of keys) { + const va = a[k], + vb = b[k], + hasA = va !== undefined; + if (hasA && vb !== undefined) { + if (!equiv(va, vb)) { + edits.push([k, vb]); + distance++; + } + } else { + (hasA ? dels : adds).push(k); + distance++; + } + } + return { distance, adds, dels, edits }; +} diff --git a/packages/diff/test/index.ts b/packages/diff/test/index.ts new file mode 100644 index 0000000000..fe579f4b67 --- /dev/null +++ b/packages/diff/test/index.ts @@ -0,0 +1,7 @@ +// import * as assert from "assert"; + +// import * as diff from "../src/index"; + +describe("diff", function () { + it("tests pending"); +}); diff --git a/packages/diff/test/tsconfig.json b/packages/diff/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/diff/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/diff/tsconfig.json b/packages/diff/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/diff/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 30ffd00930229875af92089623a42f0502768308 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 15:22:07 +0000 Subject: [PATCH 13/19] feat(hiccup-dom): re-import package (MBP2010) --- packages/hiccup-dom/.npmignore | 9 + packages/hiccup-dom/LICENSE | 201 +++++++++++++++++++++ packages/hiccup-dom/README.md | 93 ++++++++++ packages/hiccup-dom/package.json | 39 +++++ packages/hiccup-dom/src/api.ts | 1 + packages/hiccup-dom/src/diff.ts | 232 +++++++++++++++++++++++++ packages/hiccup-dom/src/dom.ts | 144 +++++++++++++++ packages/hiccup-dom/src/index.ts | 2 + packages/hiccup-dom/test/index.ts | 7 + packages/hiccup-dom/test/tsconfig.json | 10 ++ packages/hiccup-dom/tsconfig.json | 9 + 11 files changed, 747 insertions(+) create mode 100644 packages/hiccup-dom/.npmignore create mode 100644 packages/hiccup-dom/LICENSE create mode 100644 packages/hiccup-dom/README.md create mode 100644 packages/hiccup-dom/package.json create mode 100644 packages/hiccup-dom/src/api.ts create mode 100644 packages/hiccup-dom/src/diff.ts create mode 100644 packages/hiccup-dom/src/dom.ts create mode 100644 packages/hiccup-dom/src/index.ts create mode 100644 packages/hiccup-dom/test/index.ts create mode 100644 packages/hiccup-dom/test/tsconfig.json create mode 100644 packages/hiccup-dom/tsconfig.json diff --git a/packages/hiccup-dom/.npmignore b/packages/hiccup-dom/.npmignore new file mode 100644 index 0000000000..478163840f --- /dev/null +++ b/packages/hiccup-dom/.npmignore @@ -0,0 +1,9 @@ +build +coverage +dev +doc +src* +test +.nyc_output +*.tgz +*.html diff --git a/packages/hiccup-dom/LICENSE b/packages/hiccup-dom/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/hiccup-dom/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/hiccup-dom/README.md b/packages/hiccup-dom/README.md new file mode 100644 index 0000000000..563022ba23 --- /dev/null +++ b/packages/hiccup-dom/README.md @@ -0,0 +1,93 @@ +# @thi.ng/hiccup-dom + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/hiccup-dom.svg)](https://www.npmjs.com/package/@thi.ng/hiccup-dom) + +## About + +Lighweight reactive DOM components using only vanilla JS data structures +(arrays, objects, closures, iterators), based on +[@thi.ng/hiccup](https://github.com/thi-ng/umbrella/tree/master/packages/hiccup). +Supports arbitrary attributes, events, CSS conversion from JS objects, SVG. +Only ~10KB minified. + +No precompilation steps needed. The actual DOM update is based on the minimal +edit set of the recursive difference between the old and new DOM trees (both +nested JS arrays). Components can be defined as static arrays, closures or +objects with life cycle hooks (init, render, release). + +## Installation + +``` +yarn add @thi.ng/hiccup-dom +``` + +## Usage examples + +[Live demo here](http://demo.thi.ng/umbrella/hiccup-dom/dashboard/) + +![screenshot](http://demo.thi.ng/umbrella/hiccup-dom/dashboard/out.gif) + +### Basic usage patterns + +```typescript +import * as hdom from "@thi.ng/hiccup-dom"; + +// static component function to create styled box +const box = (prefix, body) => + ["div", + { + style: { + display: "inline-block", + background: "#ccc", + width: "30%", + height: "40px", + padding: "4px", + margin: "2px", + "text-align": "center" + } + }, + ["strong", prefix], ["br"], body]; + +// stateful component function +const counter = (id, from = 0, step = 1) => () => box(id, (from += step).toLocaleString()); + +// dynamic component function (external state, i.e. date) +const timer = () => box("time", new Date().toLocaleTimeString()); + +// application root component closure +// initializes stateful components +const app = (() => { + const users = counter("users"); + const profits = counter("$$$", 1e6, 99); + return () => ["div", ["h1", "Dashboard"], users, profits, timer]; +})(); + +// update loop +window.addEventListener("load", () => { + requestAnimationFrame( + ((parent, tree) => { + let prev = []; + return function update() { + hdom.diffElement(parent, prev, prev = hdom.normalizeTree(tree)); + requestAnimationFrame(update); + } + })(document.getElementById("app"), app) + ); +}); +``` + +### Lifecycle hooks + +TODO example forthcoming... + +### @thi.ng/rstream integration + +TODO example forthcoming... + +## Authors + +- Karsten Schmidt + +## License + +© 2016 - 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/hiccup-dom/package.json b/packages/hiccup-dom/package.json new file mode 100644 index 0000000000..611d0f564b --- /dev/null +++ b/packages/hiccup-dom/package.json @@ -0,0 +1,39 @@ +{ + "name": "@thi.ng/hiccup-dom", + "version": "0.0.1", + "description": "TODO", + "main": "./index.js", + "typings": "./index.d.ts", + "repository": "https://github.com/thi-ng/umbrella", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn run clean && tsc --declaration", + "clean": "rm -rf *.js *.d.ts build doc", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn run build && yarn publish --access public", + "test": "rm -rf build && tsc -p test && mocha build/test/*.js" + }, + "devDependencies": { + "@types/mocha": "^2.2.46", + "@types/node": "^9.3.0", + "mocha": "^5.0.0", + "ts-loader": "^3.3.1", + "typedoc": "^0.10.0", + "typescript": "^2.7.1", + "webpack": "^3.10.0" + }, + "dependencies": { + "@thi.ng/api": "^1.5.0", + "@thi.ng/diff": "^0.0.1", + "@thi.ng/hiccup": "0.1.5", + "@thi.ng/iterators": "^4.0.2" + }, + "keywords": [ + "ES6", + "typescript" + ], + "publishConfig": { + "access": "public" + } +} \ No newline at end of file diff --git a/packages/hiccup-dom/src/api.ts b/packages/hiccup-dom/src/api.ts new file mode 100644 index 0000000000..4785ccd78f --- /dev/null +++ b/packages/hiccup-dom/src/api.ts @@ -0,0 +1 @@ +export const DEBUG = false; diff --git a/packages/hiccup-dom/src/diff.ts b/packages/hiccup-dom/src/diff.ts new file mode 100644 index 0000000000..41ba485e92 --- /dev/null +++ b/packages/hiccup-dom/src/diff.ts @@ -0,0 +1,232 @@ +import { isArray } from "@thi.ng/checks/is-array"; +import { isFunction } from "@thi.ng/checks/is-function"; +import { isIterable } from "@thi.ng/checks/is-iterable"; +import { isString } from "@thi.ng/checks/is-string"; +import * as diff from "@thi.ng/diff"; +import { TAG_REGEXP } from "@thi.ng/hiccup/api"; + +import { DEBUG } from "./api"; +import { createDOM, removeAttribs, setAttrib, removeChild } from "./dom"; + +export function diffElement(parent: Element, prev, curr) { + _diffElement(parent, prev, curr, 0); +} + +function _diffElement(parent: Element, prev, curr, child) { + const delta = diff.diffArray(prev, curr), + edits = delta.linear, + el = parent.children[child]; + if (delta.distance === 0) { + return; + } + // DEBUG && console.log("parent", parent, "el", el, "idx", child, "edits:", edits); + // replace sub-tree iff: + // - different element type + // - different `key` attrib + // - changes in event handlers + if (edits[0][0] !== 0 || prev[1].key !== curr[1].key || hasChangedEvents(prev[1], curr[1])) { + DEBUG && console.log("replace:", prev, curr); + releaseDeep(prev); + removeChild(parent, child); + createDOM(parent, curr, undefined, child); + return; + } + if (prev.__release && prev.__release !== curr.__release) { + releaseDeep(prev); + } + if (curr.__init && prev.__init !== curr.__init) { + DEBUG && console.log("call __init", curr); + const args = [el, ...(curr.__args)]; // Safari https://bugs.webkit.org/show_bug.cgi?format=multiple&id=162003 + curr.__init.apply(curr, args); + } + if (edits[1][0] !== 0) { + diffAttributes(el, prev[1], curr[1]); + } + const equivKeys = extractEquivElements(edits), + n = edits.length, + noff = prev.length - 1, + offsets = []; + let i, j, k, eq; + for (i = noff; i >= 2; i--) { + offsets[i] = i - 2; + } + for (i = 2; i < n; i++) { + const e = edits[i], status = e[0], idx = e[1][0], val = e[1][1]; + // DEBUG && console.log(`edit: o:[${offsets.toString()}] i:${idx} s:${status}`, val); + if (status === -1) { + if (isArray(val)) { + k = val[1].key; + if (k !== undefined && equivKeys[k][2] !== undefined) { + eq = equivKeys[k]; + k = eq[0]; + // DEBUG && console.log(`diff equiv key @ ${k}:`, prev[k], curr[eq[2]]); + _diffElement(el, prev[k], curr[eq[2]], offsets[k]); + } else { + // DEBUG && console.log("remove @", offsets[idx], val); + releaseDeep(val); + removeChild(el, offsets[idx]); + for (j = noff; j >= idx; j--) { + offsets[j] = Math.max(offsets[j] - 1, 0); + } + } + } else if (isString(val)) { + el.textContent = ""; + } + } else if (status === 1) { + if (isString(val)) { + el.textContent = val; + } else if (isArray(val)) { + k = val[1].key; + if (k === undefined || (k && equivKeys[k][0] === undefined)) { + // DEBUG && console.log("insert @", offsets[idx], val); + createDOM(el, val, undefined, offsets[idx]); + for (j = noff; j >= idx; j--) { + offsets[j]++; + } + } + } + } + } +} + +function releaseDeep(tag: any) { + if (isArray(tag)) { + if ((tag).__release) { + // DEBUG && console.log("call __release", tag); + (tag).__release.apply(tag, (tag).__args); + delete (tag).__release; + } + for (let i = tag.length - 1; i >= 2; i--) { + releaseDeep(tag[i]); + } + } +} + +function normalizeElement(spec: any[]) { + let tag = spec[0], + content = spec.slice(1), c, + match, id, clazz; + const attribs: any = {}; + if (!isString(tag) || !(match = TAG_REGEXP.exec(tag))) { + throw new Error(`${tag} is not a valid tag name`); + } + tag = match[1]; + id = match[2]; + clazz = match[3]; + if (id) { + attribs.id = id; + } + if (clazz) { + attribs.class = clazz.replace(/\./g, " "); + } + c = content[0]; + if (c != null && c.constructor === Object) { + Object.assign(attribs, c); + content.shift(); + } + return [tag, attribs, content.length > 0 ? content : undefined]; +} + +export function normalizeTree(el: any, path = [0], keys = true, span = true) { + if (el == null) { + return; + } + if (isArray(el)) { + if (el.length === 0) { + return; + } + const tag = el[0]; + let norm; + if (isFunction(tag)) { + return normalizeTree(tag.apply(null, el.slice(1)), path.slice(), keys, span); + } + if (!isString(tag)) { + const args = el.slice(1); + norm = normalizeTree(tag.render.apply(null, args), path.slice(), keys, span); + if (norm !== undefined) { + if (keys && norm[1].key === undefined) { + norm[1].key = path.join("-"); + } + norm.__init = tag.init; + norm.__release = tag.release; + norm.__args = args; + } + return norm; + } + norm = normalizeElement(el); + if (keys && norm[1].key === undefined) { + norm[1].key = path.join("-"); + } + if (norm[2]) { + const children = norm[2].slice(), + n = children.length; + norm.length = 2; + span = span && norm[0] !== "text"; + for (let i = 0, j = 2, k = 0; i < n; i++) { + let el = children[i]; + if (el != null) { + if (!isArray(el) && !isString(el) && isIterable(el)) { + for (let c of el) { + c = normalizeTree(c, [...path, k], keys, span); + if (c !== undefined) { + norm[j++] = c; + } + k++; + } + } else { + el = normalizeTree(el, [...path, k], keys, span); + if (el !== undefined) { + norm[j++] = el; + } + k++; + } + } + } + } + return norm; + } + if (isFunction(el)) { + return normalizeTree(el(), path, keys, span); + } + return span ? + ["span", keys ? { key: path.join("-") } : {}, el.toString()] : + el.toString(); +} + +function hasChangedEvents(prev: any, curr: any) { + for (let k in curr) { + if (k.indexOf("on-") === 0 && prev[k] !== curr[k]) { + return true; + } + } + return false; +} + +export function diffAttributes(el: Element, prev: any, curr: any) { + const delta = diff.diffObject(prev, curr); + let i, a, attribs; + DEBUG && console.log("diff attribs:", delta); + removeAttribs(el, delta.dels); + for (attribs = delta.edits, i = attribs.length - 1; i >= 0; i--) { + a = attribs[i]; + setAttrib(el, a[0], a[1]); + } + for (attribs = delta.adds, i = attribs.length - 1; i >= 0; i--) { + a = attribs[i]; + setAttrib(el, a, curr[a]); + } +} + +export function extractEquivElements(edits: diff.DiffLogEntry[]) { + const equiv = {}; + let k; + for (let i = edits.length - 1; i >= 0; i--) { + const e = edits[i], + v = e[1][1]; + if (isArray(v) && (k = v[1].key)) { + equiv[k] = equiv[k] || [, ,]; + equiv[k][e[0] + 1] = e[1][0]; + } + } + return equiv; +} diff --git a/packages/hiccup-dom/src/dom.ts b/packages/hiccup-dom/src/dom.ts new file mode 100644 index 0000000000..46d4fe87c6 --- /dev/null +++ b/packages/hiccup-dom/src/dom.ts @@ -0,0 +1,144 @@ +import { isArray } from "@thi.ng/checks/is-array"; +import { isFunction } from "@thi.ng/checks/is-function"; +import { isIterable } from "@thi.ng/checks/is-iterable"; +import { isString } from "@thi.ng/checks/is-string"; +import { SVG_TAGS, SVG_NS } from "@thi.ng/hiccup/api"; +import { css } from "@thi.ng/hiccup/css"; +import { map } from "@thi.ng/iterators/map"; + +export function createDOM(parent: Element, tag: any, opts?: any, insert?: number) { + if (isArray(tag)) { + if (isFunction(tag[0])) { + return createDOM(parent, tag[0].apply(null, tag.slice(1), opts)); + } + const el = createElement(parent, tag[0], tag[1], insert); + if ((tag).__init) { + const args = [el, ...((tag).__args)]; // Safari https://bugs.webkit.org/show_bug.cgi?format=multiple&id=162003 + (tag).__init.apply(tag, args); + } + if (tag[2]) { + const n = tag.length; + for (let i = 2; i < n; i++) { + createDOM(el, tag[i], opts); + } + } + return el; + } + if (!isString(tag) && isIterable(tag)) { + return [...(map((x) => createDOM(parent, x, opts), tag))]; + } + if (tag == null) { + return parent; + } + return createTextElement(parent, tag); +} + +export function createElement(parent: Element, tag: string, attribs?: any, insert?: number) { + const el = SVG_TAGS[tag] ? + document.createElementNS(SVG_NS, tag) : + document.createElement(tag); + if (parent) { + if (insert === undefined) { + parent.appendChild(el); + } else { + parent.insertBefore(el, parent.children[insert]); + } + } + if (attribs) { + setAttribs(el, attribs); + } + return el; +} + +export function createTextElement(parent: Element, content: string, insert?: number) { + const el = document.createTextNode(content); + if (parent) { + if (insert === undefined) { + parent.appendChild(el); + } else { + parent.insertBefore(el, parent.children[insert]); + } + } + return el; +} + +export function cloneWithNewAttribs(el: Element, attribs: any) { + const res = el.cloneNode(true); + setAttribs(res, attribs); + el.parentNode.replaceChild(res, el); + return res; +} + +export function setAttribs(el: Element, attribs: any) { + const keys = Object.keys(attribs); + for (let i = keys.length - 1; i >= 0; i--) { + const k = keys[i]; + setAttrib(el, k, attribs[k]); + } + return el; +} + +export function setAttrib(el: Element, k: string, v: any) { + if (v !== undefined) { + switch (k) { + case "style": + setStyle(el, v); + break; + case "value": + updateValueAttrib(el, v); + break; + default: + if (k.indexOf("on-") === 0) { + el.addEventListener(k.substr(3), v); + } else { + el.setAttribute(k, v); + } + } + } else { + el.removeAttribute(k); + } + return el; +} + +export function updateValueAttrib(el: HTMLInputElement, v: any) { + switch (el.type) { + case "text": + case "textarea": + case "password": + case "email": + case "url": + case "tel": + case "search": + if (el.value !== undefined && isString(v)) { + const e = el as HTMLInputElement; + const off = v.length - (e.value.length - e.selectionStart); + e.value = v; + e.selectionStart = e.selectionEnd = off; + return; + } + default: + } + el.value = v; +} + +export function removeAttribs(el: Element, attribs: any[]) { + for (let i = attribs.length - 1; i >= 0; i--) { + el.removeAttribute(attribs[i]); + } +} + +export function setStyle(el: Element, styles: any) { + el.setAttribute("style", css(styles)); + return el; +} + +export function clearDOM(el: Element) { + el.innerHTML = ""; +} + +export function removeChild(parent: Element, childIdx: number) { + const n = parent.children[childIdx]; + if (n !== undefined) { + n.remove(); + } +} diff --git a/packages/hiccup-dom/src/index.ts b/packages/hiccup-dom/src/index.ts new file mode 100644 index 0000000000..3577553aa8 --- /dev/null +++ b/packages/hiccup-dom/src/index.ts @@ -0,0 +1,2 @@ +export * from "./diff"; +export * from "./dom"; diff --git a/packages/hiccup-dom/test/index.ts b/packages/hiccup-dom/test/index.ts new file mode 100644 index 0000000000..9c8f3dccda --- /dev/null +++ b/packages/hiccup-dom/test/index.ts @@ -0,0 +1,7 @@ +// import * as assert from "assert"; + +// import * as hdom from "../src/index"; + +describe("hiccup-dom", function () { + it("tests pending"); +}); diff --git a/packages/hiccup-dom/test/tsconfig.json b/packages/hiccup-dom/test/tsconfig.json new file mode 100644 index 0000000000..bcf29ace54 --- /dev/null +++ b/packages/hiccup-dom/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/hiccup-dom/tsconfig.json b/packages/hiccup-dom/tsconfig.json new file mode 100644 index 0000000000..bd6481a5a6 --- /dev/null +++ b/packages/hiccup-dom/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "." + }, + "include": [ + "./src/**/*.ts" + ] +} From 4cc4bbc07fc68b80435a28d07665cde11ef43ed4 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:05:53 +0000 Subject: [PATCH 14/19] build: cleanup/update deps --- package.json | 2 +- packages/csp/package.json | 1 - packages/hiccup-dom/package.json | 1 - packages/rstream-csp/package.json | 2 +- packages/rstream-log/package.json | 3 +- packages/rstream/package.json | 1 - yarn.lock | 235 ++++++++++++++++-------------- 7 files changed, 129 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index 88d29dab0d..db033527f8 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "lerna": "^2.8.0", "nyc": "^11.4.1", "tslint": "^5.9.1", - "typescript": "^2.6.2" + "typescript": "^2.7.1" }, "scripts": { "build": "yarn install && lerna bootstrap && lerna run build --sort", diff --git a/packages/csp/package.json b/packages/csp/package.json index e6cae34523..b9c57a7c0b 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -30,7 +30,6 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0", "@thi.ng/dcons": "^0.1.9", "@thi.ng/transducers": "^1.0.5" }, diff --git a/packages/hiccup-dom/package.json b/packages/hiccup-dom/package.json index 611d0f564b..af97ab53c5 100644 --- a/packages/hiccup-dom/package.json +++ b/packages/hiccup-dom/package.json @@ -24,7 +24,6 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0", "@thi.ng/diff": "^0.0.1", "@thi.ng/hiccup": "0.1.5", "@thi.ng/iterators": "^4.0.2" diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 938adff4b3..3c451f670b 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0", + "@thi.ng/csp": "^0.3.8", "@thi.ng/rstream": "^0.8.1" }, "keywords": [ diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index fb057669fb..5f4a99a7ac 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -26,8 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/rstream": "^0.8.1", - "@thi.ng/transducers": "^1.0.5" + "@thi.ng/rstream": "^0.8.1" }, "keywords": [ "ES6", diff --git a/packages/rstream/package.json b/packages/rstream/package.json index f2e5937d43..eb3f71c042 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -26,7 +26,6 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0", "@thi.ng/atom": "^0.4.0", "@thi.ng/transducers": "^1.0.5" }, diff --git a/yarn.lock b/yarn.lock index c1296bef38..231274eace 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,44 +2,57 @@ # yarn lockfile v1 -"@types/fs-extra@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-4.0.0.tgz#1dd742ad5c9bce308f7a52d02ebc01421bc9102f" +"@types/events@*": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.1.0.tgz#93b1be91f63c184450385272c47b6496fd028e02" + +"@types/fs-extra@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.0.tgz#d3e225b35eb5c6d3a5a782c28219df365c781413" + dependencies: + "@types/node" "*" + +"@types/glob@*": + version "5.0.35" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" dependencies: + "@types/events" "*" + "@types/minimatch" "*" "@types/node" "*" -"@types/handlebars@4.0.31": - version "4.0.31" - resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.31.tgz#a7fba66fafe42713aee88eeca8db91192efe6e72" +"@types/handlebars@4.0.36": + version "4.0.36" + resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.36.tgz#ff57c77fa1ab6713bb446534ddc4d979707a3a79" -"@types/highlight.js@9.1.8": - version "9.1.8" - resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.1.8.tgz#d227f18bcb8f3f187e16965f2444859a04689758" +"@types/highlight.js@9.12.2": + version "9.12.2" + resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.2.tgz#6ee7cd395effe5ec80b515d3ff1699068cd0cd1d" -"@types/lodash@4.14.74": - version "4.14.74" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.74.tgz#ac3bd8db988e7f7038e5d22bd76a7ba13f876168" +"@types/lodash@4.14.99": + version "4.14.99" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.99.tgz#e6e10c0a4cc16c7409b3181f1e66880d2fb7d4dc" "@types/marked@0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.3.0.tgz#583c223dd33385a1dda01aaf77b0cd0411c4b524" -"@types/minimatch@2.0.29": - version "2.0.29" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a" +"@types/minimatch@*", "@types/minimatch@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" "@types/mocha@^2.2.46": - version "2.2.47" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.47.tgz#30bbd880834d4af0f609025f282a69b8d4458f06" + version "2.2.48" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab" "@types/node@*", "@types/node@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" + version "9.4.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.0.tgz#b85a0bcf1e1cc84eb4901b7e96966aedc6f078d1" -"@types/shelljs@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.0.tgz#229c157c6bc1e67d6b990e6c5e18dbd2ff58cff0" +"@types/shelljs@0.7.7": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.7.tgz#1f7bfa28947661afea06365db9b1135bbc903ec4" dependencies: + "@types/glob" "*" "@types/node" "*" JSONStream@^1.0.4: @@ -759,46 +772,46 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -conventional-changelog-angular@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.0.tgz#0a26a071f2c9fcfcf2b86ba0cfbf6e6301b75bfa" +conventional-changelog-angular@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.1.tgz#e1434d017c854032b272f690424a8c0ca16dc318" dependencies: compare-func "^1.3.1" q "^1.4.1" -conventional-changelog-atom@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.2.tgz#12595ad5267a6937c34cf900281b1c65198a4c63" +conventional-changelog-atom@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.2.0.tgz#72f18e5c74e3d8807411252fe013818ddffa7157" dependencies: q "^1.4.1" conventional-changelog-cli@^1.3.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.5.tgz#46c51496216b7406588883defa6fac589e9bb31e" + version "1.3.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.8.tgz#3b3f3591cb8d1f154bdb28e1819c5fcd8d967536" dependencies: add-stream "^1.0.0" - conventional-changelog "^1.1.7" + conventional-changelog "^1.1.10" lodash "^4.1.0" meow "^3.7.0" tempfile "^1.1.1" -conventional-changelog-codemirror@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.2.1.tgz#299a4f7147baf350e6c8158fc54954a291c5cc09" +conventional-changelog-codemirror@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.0.tgz#4dd8abb9f521a638cab49f683496c26b8a5c6d31" dependencies: q "^1.4.1" -conventional-changelog-core@^1.9.3: - version "1.9.5" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.5.tgz#5db7566dad7c0cb75daf47fbb2976f7bf9928c1d" +conventional-changelog-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.0.tgz#1bdf7d21f3d066427ff9e07db0a2c5dd60015b9f" dependencies: - conventional-changelog-writer "^2.0.3" + conventional-changelog-writer "^3.0.0" conventional-commits-parser "^2.1.0" dateformat "^1.0.12" get-pkg-repo "^1.0.0" git-raw-commits "^1.3.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^1.2.3" + git-semver-tags "^1.3.0" lodash "^4.0.0" normalize-package-data "^2.3.5" q "^1.4.1" @@ -806,21 +819,21 @@ conventional-changelog-core@^1.9.3: read-pkg-up "^1.0.1" through2 "^2.0.0" -conventional-changelog-ember@^0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.10.tgz#dcd6e4cdc2e6c2b58653cf4d2cb1656a60421929" +conventional-changelog-ember@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.3.1.tgz#bc71dc0a57e5c7ed0bf0538c32e44220691871d1" dependencies: q "^1.4.1" -conventional-changelog-eslint@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.2.1.tgz#2c2a11beb216f80649ba72834180293b687c0662" +conventional-changelog-eslint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.0.tgz#c63cd9d6f09d4e204530ae7369d7a20a167bc6bc" dependencies: q "^1.4.1" -conventional-changelog-express@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.2.1.tgz#838d9e1e6c9099703b150b9c19aa2d781742bd6c" +conventional-changelog-express@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.3.0.tgz#5ed006f48682d8615ee0ab5f53cacb26fbd3e1c8" dependencies: q "^1.4.1" @@ -836,16 +849,16 @@ conventional-changelog-jscs@^0.1.0: dependencies: q "^1.4.1" -conventional-changelog-jshint@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.2.1.tgz#86139bb3ac99899f2b177e9617e09b37d99bcf3a" +conventional-changelog-jshint@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.0.tgz#0393fd468113baf73cba911d17c5826423366a28" dependencies: compare-func "^1.3.1" q "^1.4.1" -conventional-changelog-writer@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-2.0.3.tgz#073b0c39f1cc8fc0fd9b1566e93833f51489c81c" +conventional-changelog-writer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.0.tgz#e106154ed94341e387d717b61be2181ff53254cc" dependencies: compare-func "^1.3.1" conventional-commits-filter "^1.1.1" @@ -858,20 +871,20 @@ conventional-changelog-writer@^2.0.3: split "^1.0.0" through2 "^2.0.0" -conventional-changelog@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.7.tgz#9151a62b1d8edb2d82711dabf5b7cf71041f82b1" - dependencies: - conventional-changelog-angular "^1.5.2" - conventional-changelog-atom "^0.1.2" - conventional-changelog-codemirror "^0.2.1" - conventional-changelog-core "^1.9.3" - conventional-changelog-ember "^0.2.9" - conventional-changelog-eslint "^0.2.1" - conventional-changelog-express "^0.2.1" +conventional-changelog@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.10.tgz#d9bb3aad9086152d283e4707fb45a5b7a28e9e98" + dependencies: + conventional-changelog-angular "^1.6.1" + conventional-changelog-atom "^0.2.0" + conventional-changelog-codemirror "^0.3.0" + conventional-changelog-core "^2.0.0" + conventional-changelog-ember "^0.3.1" + conventional-changelog-eslint "^1.0.0" + conventional-changelog-express "^0.3.0" conventional-changelog-jquery "^0.1.0" conventional-changelog-jscs "^0.1.0" - conventional-changelog-jshint "^0.2.1" + conventional-changelog-jshint "^0.3.0" conventional-commits-filter@^1.1.1: version "1.1.1" @@ -893,14 +906,14 @@ conventional-commits-parser@^2.1.0: trim-off-newlines "^1.0.0" conventional-recommended-bump@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.1.0.tgz#964d4fcc70fb5259d41fa9b39d3df6afdb87d253" + version "1.2.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.2.0.tgz#864fb955825d9c6056620cee4657b0dc0628a3e9" dependencies: concat-stream "^1.4.10" conventional-commits-filter "^1.1.1" conventional-commits-parser "^2.1.0" git-raw-commits "^1.3.0" - git-semver-tags "^1.2.3" + git-semver-tags "^1.3.0" meow "^3.3.0" object-assign "^4.0.1" @@ -1127,8 +1140,8 @@ diffie-hellman@^5.0.0: randombytes "^2.0.0" domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" dot-prop@^3.0.0: version "3.0.0" @@ -1482,7 +1495,7 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@^4.0.0, fs-extra@^4.0.1: +fs-extra@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: @@ -1490,6 +1503,14 @@ fs-extra@^4.0.0, fs-extra@^4.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1584,9 +1605,9 @@ git-remote-origin-url@^2.0.0: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.3.tgz#188b453882bf9d7a23afd31baba537dab7388d5d" +git-semver-tags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.0.tgz#b154833a6ab5c360c0ad3b1aa9b8f12ea06de919" dependencies: meow "^3.3.0" semver "^5.0.1" @@ -2404,7 +2425,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^0.3.5: +marked@^0.3.12: version "0.3.12" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.12.tgz#7cf25ff2252632f3fe2406bde258e94eee927519" @@ -3060,8 +3081,8 @@ randomfill@^1.0.3: safe-buffer "^5.1.0" rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: - version "1.2.4" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -3163,8 +3184,8 @@ regex-not@^1.0.0: extend-shallow "^2.0.1" registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -3345,9 +3366,9 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.7.0: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" +shelljs@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.1.tgz#729e038c413a2254c4078b95ed46e0397154a9f1" dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -3691,8 +3712,8 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" timers-browserify@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" + version "2.0.6" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" dependencies: setimmediate "^1.0.4" @@ -3750,8 +3771,8 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" ts-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-3.3.1.tgz#5d24b425876cfed094f8da95375c9fd1e598faec" + version "3.4.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-3.4.0.tgz#c376bc0538d4c441ea8790c3fd841ebfdbfb99d0" dependencies: chalk "^2.3.0" enhanced-resolve "^3.0.0" @@ -3781,8 +3802,8 @@ tslint@^5.9.1: tsutils "^2.12.1" tsutils@^2.12.1: - version "2.19.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.19.1.tgz#76d7ebdea9d7a7bf4a05f50ead3701b0168708d7" + version "2.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.20.0.tgz#303394064bc80be8ee04e10b8609ae852e9312d3" dependencies: tslib "^1.8.1" @@ -3808,35 +3829,31 @@ typedoc-default-themes@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz#6dc2433e78ed8bea8e887a3acde2f31785bd6227" -typedoc@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.9.0.tgz#159bff7c7784ce5b91d86f3e4cc8928e62040957" +typedoc@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.10.0.tgz#898b447248dabf68ecbde9d5ccf5141fda8aa166" dependencies: - "@types/fs-extra" "4.0.0" - "@types/handlebars" "4.0.31" - "@types/highlight.js" "9.1.8" - "@types/lodash" "4.14.74" + "@types/fs-extra" "5.0.0" + "@types/handlebars" "4.0.36" + "@types/highlight.js" "9.12.2" + "@types/lodash" "4.14.99" "@types/marked" "0.3.0" - "@types/minimatch" "2.0.29" - "@types/shelljs" "0.7.0" - fs-extra "^4.0.0" + "@types/minimatch" "3.0.3" + "@types/shelljs" "0.7.7" + fs-extra "^5.0.0" handlebars "^4.0.6" highlight.js "^9.0.0" lodash "^4.13.1" - marked "^0.3.5" + marked "^0.3.12" minimatch "^3.0.0" progress "^2.0.0" - shelljs "^0.7.0" + shelljs "^0.8.1" typedoc-default-themes "^0.5.0" - typescript "2.4.1" + typescript "2.7.1" -typescript@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.1.tgz#c3ccb16ddaa0b2314de031e7e6fee89e5ba346bc" - -typescript@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" +typescript@2.7.1, typescript@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.1.tgz#bb3682c2c791ac90e7c6210b26478a8da085c359" uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" From 5d7c10a3144036fab0b51eed0c9327367e4967a1 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:06:25 +0000 Subject: [PATCH 15/19] test(rstream): fix tests (TS 2.7.*) --- packages/rstream/test/stream-merge.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rstream/test/stream-merge.ts b/packages/rstream/test/stream-merge.ts index 7c65216240..b137987731 100644 --- a/packages/rstream/test/stream-merge.ts +++ b/packages/rstream/test/stream-merge.ts @@ -21,7 +21,7 @@ describe("StreamMerge", () => { }; beforeEach(() => { - src = new rs.StreamMerge([ + src = new rs.StreamMerge([ rs.fromIterable([1, 2]), rs.fromIterable([10, 20, 30, 40]), rs.fromIterable([100, 200, 300]) @@ -52,7 +52,7 @@ describe("StreamMerge", () => { }); it("applies transducer", (done) => { - src = new rs.StreamMerge( + src = new rs.StreamMerge( [ rs.fromIterable([1, 2]), rs.fromIterable([10, 20]) From beebe4352c2393284775d3a4ca1088982ec391c2 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:48:38 +0000 Subject: [PATCH 16/19] chore: update keywords for all packages --- packages/api/package.json | 3 +++ packages/atom/package.json | 7 ++++++- packages/bitstream/package.json | 5 +++-- packages/checks/package.json | 6 ++++-- packages/csp/package.json | 3 +++ packages/diff/package.json | 4 ++++ packages/hiccup-dom/package.json | 8 +++++++- packages/hiccup/package.json | 2 +- packages/rle-pack/package.json | 2 +- packages/rstream-log/package.json | 2 ++ packages/rstream/package.json | 3 ++- packages/transducers/package.json | 1 + 12 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 099cce2a3f..4138894892 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -29,9 +29,12 @@ "@thi.ng/checks": "^1.1.4" }, "keywords": [ + "compare", + "equality", "ES6", "generic", "interfaces", + "type declarations", "typescript" ], "publishConfig": { diff --git a/packages/atom/package.json b/packages/atom/package.json index aa172ec458..6647a08a1e 100644 --- a/packages/atom/package.json +++ b/packages/atom/package.json @@ -29,8 +29,13 @@ "@thi.ng/api": "^1.5.0" }, "keywords": [ + "cursor", + "datastructure", "ES6", - "typescript" + "history", + "immutable", + "typescript", + "undo" ], "publishConfig": { "access": "public" diff --git a/packages/bitstream/package.json b/packages/bitstream/package.json index 2deda27950..ba89ce6e88 100644 --- a/packages/bitstream/package.json +++ b/packages/bitstream/package.json @@ -26,11 +26,12 @@ "webpack": "^3.10.0" }, "keywords": [ - "ES6", "binary", "bits", - "stream", + "datastructure", + "ES6", "iterator", + "stream", "typescript" ], "publishConfig": { diff --git a/packages/checks/package.json b/packages/checks/package.json index 4b7ed8625e..280ab73c77 100644 --- a/packages/checks/package.json +++ b/packages/checks/package.json @@ -26,10 +26,12 @@ "webpack": "^3.10.0" }, "keywords": [ - "ES6", "check", + "detect", + "ES6", + "feature", "reflection", - "type", + "types", "typescript", "validation" ], diff --git a/packages/csp/package.json b/packages/csp/package.json index b9c57a7c0b..be25bf011f 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -37,9 +37,12 @@ "async", "csp", "channel", + "datastructure", "ES6", + "multiplex", "pipeline", "promise", + "pubsub", "transducers", "typescript" ], diff --git a/packages/diff/package.json b/packages/diff/package.json index ca62efbcff..f3be677f8a 100644 --- a/packages/diff/package.json +++ b/packages/diff/package.json @@ -27,7 +27,11 @@ "@thi.ng/api": "^1.5.0" }, "keywords": [ + "array", + "diff", + "edit", "ES6", + "nested", "typescript" ], "publishConfig": { diff --git a/packages/hiccup-dom/package.json b/packages/hiccup-dom/package.json index af97ab53c5..e792335008 100644 --- a/packages/hiccup-dom/package.json +++ b/packages/hiccup-dom/package.json @@ -29,8 +29,14 @@ "@thi.ng/iterators": "^4.0.2" }, "keywords": [ + "browser", + "components", + "DOM", "ES6", - "typescript" + "reactive", + "typescript", + "ui", + "vdom" ], "publishConfig": { "access": "public" diff --git a/packages/hiccup/package.json b/packages/hiccup/package.json index 769572d208..0a2a97819a 100644 --- a/packages/hiccup/package.json +++ b/packages/hiccup/package.json @@ -29,9 +29,9 @@ "@thi.ng/checks": "^1.1.4" }, "keywords": [ - "ES6", "clojure", "components", + "ES6", "hiccup", "html", "iterators", diff --git a/packages/rle-pack/package.json b/packages/rle-pack/package.json index 1afec08824..c5239ec677 100644 --- a/packages/rle-pack/package.json +++ b/packages/rle-pack/package.json @@ -30,9 +30,9 @@ "@thi.ng/bitstream": "^0.3.4" }, "keywords": [ - "ES6", "binary", "bits", + "ES6", "packer", "RLE", "typescript" diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index 5f4a99a7ac..a0c8f3a39e 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -31,7 +31,9 @@ "keywords": [ "ES6", "logger", + "logging", "multilevel", + "multiplex", "pipeline", "transducers", "typescript" diff --git a/packages/rstream/package.json b/packages/rstream/package.json index eb3f71c042..cbba4e0586 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -30,8 +30,9 @@ "@thi.ng/transducers": "^1.0.5" }, "keywords": [ - "ES6", + "datastructure", "events", + "ES6", "pipeline", "reactive", "stream", diff --git a/packages/transducers/package.json b/packages/transducers/package.json index b2a73e2a43..e5ccbfaa46 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -36,6 +36,7 @@ "pipeline", "reducers", "transducers", + "transformation", "typescript" ], "publishConfig": { From 3101698de70e9965db36c1d83cb5f3b0da11df56 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:49:55 +0000 Subject: [PATCH 17/19] feat(hiccup-dom): add start(), update readme --- packages/hiccup-dom/README.md | 39 ++++++++++++++++++-------------- packages/hiccup-dom/src/diff.ts | 8 +++---- packages/hiccup-dom/src/index.ts | 1 + packages/hiccup-dom/src/start.ts | 10 ++++++++ 4 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 packages/hiccup-dom/src/start.ts diff --git a/packages/hiccup-dom/README.md b/packages/hiccup-dom/README.md index 563022ba23..d9aed482e0 100644 --- a/packages/hiccup-dom/README.md +++ b/packages/hiccup-dom/README.md @@ -10,10 +10,25 @@ Lighweight reactive DOM components using only vanilla JS data structures Supports arbitrary attributes, events, CSS conversion from JS objects, SVG. Only ~10KB minified. -No precompilation steps needed. The actual DOM update is based on the minimal -edit set of the recursive difference between the old and new DOM trees (both -nested JS arrays). Components can be defined as static arrays, closures or -objects with life cycle hooks (init, render, release). +No template engine & no precompilation steps needed, just use the full +expressiveness of ES6 to define your DOM tree. + +The actual DOM update is based on the minimal edit set of the recursive +difference between the old and new DOM trees (both nested JS arrays). +Components can be defined as static arrays, closures or objects with life cycle +hooks (init, render, release). + +The approach is inspired by Clojure's +[Hiccup](https://github.com/weavejester/hiccup) and +[Reagent](http://reagent-project.github.io/) projects, however the latter is a +wrapper around React, whereas this library is standalone, more lowlevel & +less opinionated. + +If you're interested in using this, please also consider the +[@thi.ng/atom](https://github.com/thi-ng/atom) +[@thi.ng/rstream](https://github.com/thi-ng/rstream) packages to integrate app +state handling, event streams & reactive value subscriptions. Examples +forthcoming... ## Installation @@ -30,7 +45,7 @@ yarn add @thi.ng/hiccup-dom ### Basic usage patterns ```typescript -import * as hdom from "@thi.ng/hiccup-dom"; +import { start } from "@thi.ng/hiccup-dom"; // static component function to create styled box const box = (prefix, body) => @@ -62,18 +77,8 @@ const app = (() => { return () => ["div", ["h1", "Dashboard"], users, profits, timer]; })(); -// update loop -window.addEventListener("load", () => { - requestAnimationFrame( - ((parent, tree) => { - let prev = []; - return function update() { - hdom.diffElement(parent, prev, prev = hdom.normalizeTree(tree)); - requestAnimationFrame(update); - } - })(document.getElementById("app"), app) - ); -}); +// start update loop (RAF) +window.addEventListener("load", () => start(document.getElementById("app"), app)); ``` ### Lifecycle hooks diff --git a/packages/hiccup-dom/src/diff.ts b/packages/hiccup-dom/src/diff.ts index 41ba485e92..9ddca6a106 100644 --- a/packages/hiccup-dom/src/diff.ts +++ b/packages/hiccup-dom/src/diff.ts @@ -8,11 +8,11 @@ import { TAG_REGEXP } from "@thi.ng/hiccup/api"; import { DEBUG } from "./api"; import { createDOM, removeAttribs, setAttrib, removeChild } from "./dom"; -export function diffElement(parent: Element, prev, curr) { +export function diffElement(parent: Element, prev: any, curr: any) { _diffElement(parent, prev, curr, 0); } -function _diffElement(parent: Element, prev, curr, child) { +function _diffElement(parent: Element, prev: any, curr: any, child: number) { const delta = diff.diffArray(prev, curr), edits = delta.linear, el = parent.children[child]; @@ -202,7 +202,7 @@ function hasChangedEvents(prev: any, curr: any) { return false; } -export function diffAttributes(el: Element, prev: any, curr: any) { +function diffAttributes(el: Element, prev: any, curr: any) { const delta = diff.diffObject(prev, curr); let i, a, attribs; DEBUG && console.log("diff attribs:", delta); @@ -217,7 +217,7 @@ export function diffAttributes(el: Element, prev: any, curr: any) { } } -export function extractEquivElements(edits: diff.DiffLogEntry[]) { +function extractEquivElements(edits: diff.DiffLogEntry[]) { const equiv = {}; let k; for (let i = edits.length - 1; i >= 0; i--) { diff --git a/packages/hiccup-dom/src/index.ts b/packages/hiccup-dom/src/index.ts index 3577553aa8..920d91898f 100644 --- a/packages/hiccup-dom/src/index.ts +++ b/packages/hiccup-dom/src/index.ts @@ -1,2 +1,3 @@ export * from "./diff"; export * from "./dom"; +export * from "./start"; diff --git a/packages/hiccup-dom/src/start.ts b/packages/hiccup-dom/src/start.ts new file mode 100644 index 0000000000..c11ba4963e --- /dev/null +++ b/packages/hiccup-dom/src/start.ts @@ -0,0 +1,10 @@ +import { diffElement, normalizeTree } from "./diff"; + +export function start(parent, tree: any) { + let prev = []; + function update() { + diffElement(parent, prev, prev = normalizeTree(tree)); + requestAnimationFrame(update); + } + requestAnimationFrame(update); +} From 326d3c31e9e8f07b7bb271668995ab3ec1a8c6be Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:56:45 +0000 Subject: [PATCH 18/19] build: update .npmignore --- packages/atom/.npmignore | 1 + packages/bitstream/.npmignore | 1 + packages/checks/.npmignore | 1 + packages/csp/.npmignore | 1 + packages/dcons/.npmignore | 1 + packages/diff/.npmignore | 1 + packages/hiccup-dom/.npmignore | 1 + packages/hiccup/.npmignore | 1 + packages/iterators/.npmignore | 1 + packages/rle-pack/.npmignore | 1 + packages/rstream-csp/.npmignore | 1 + packages/rstream-log/.npmignore | 1 + packages/rstream/.npmignore | 1 + packages/transducers/.npmignore | 1 + packages/unionstruct/.npmignore | 1 + scripts/make-module | 1 + 16 files changed, 16 insertions(+) diff --git a/packages/atom/.npmignore b/packages/atom/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/atom/.npmignore +++ b/packages/atom/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/bitstream/.npmignore b/packages/bitstream/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/bitstream/.npmignore +++ b/packages/bitstream/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/checks/.npmignore b/packages/checks/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/checks/.npmignore +++ b/packages/checks/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/csp/.npmignore b/packages/csp/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/csp/.npmignore +++ b/packages/csp/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/dcons/.npmignore b/packages/dcons/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/dcons/.npmignore +++ b/packages/dcons/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/diff/.npmignore b/packages/diff/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/diff/.npmignore +++ b/packages/diff/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/hiccup-dom/.npmignore b/packages/hiccup-dom/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/hiccup-dom/.npmignore +++ b/packages/hiccup-dom/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/hiccup/.npmignore b/packages/hiccup/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/hiccup/.npmignore +++ b/packages/hiccup/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/iterators/.npmignore b/packages/iterators/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/iterators/.npmignore +++ b/packages/iterators/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/rle-pack/.npmignore b/packages/rle-pack/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/rle-pack/.npmignore +++ b/packages/rle-pack/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/rstream-csp/.npmignore b/packages/rstream-csp/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/rstream-csp/.npmignore +++ b/packages/rstream-csp/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/rstream-log/.npmignore b/packages/rstream-log/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/rstream-log/.npmignore +++ b/packages/rstream-log/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/rstream/.npmignore b/packages/rstream/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/rstream/.npmignore +++ b/packages/rstream/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/transducers/.npmignore b/packages/transducers/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/transducers/.npmignore +++ b/packages/transducers/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/packages/unionstruct/.npmignore b/packages/unionstruct/.npmignore index 478163840f..d703bda97a 100644 --- a/packages/unionstruct/.npmignore +++ b/packages/unionstruct/.npmignore @@ -5,5 +5,6 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html diff --git a/scripts/make-module b/scripts/make-module index 376e209b7f..d52126d2a5 100755 --- a/scripts/make-module +++ b/scripts/make-module @@ -101,6 +101,7 @@ doc src* test .nyc_output +tsconfig.json *.tgz *.html EOF From 794b1fd5934814d633b0199221487ef340024fe0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 1 Feb 2018 16:59:50 +0000 Subject: [PATCH 19/19] Publish - @thi.ng/api@2.0.0 - @thi.ng/atom@0.4.1 - @thi.ng/bitstream@0.3.5 - @thi.ng/checks@1.1.5 - @thi.ng/csp@0.3.9 - @thi.ng/dcons@0.1.10 - @thi.ng/diff@0.1.0 - @thi.ng/hiccup-dom@0.1.0 - @thi.ng/hiccup@0.1.6 - @thi.ng/iterators@4.0.3 - @thi.ng/rle-pack@0.2.6 - @thi.ng/rstream-csp@0.1.11 - @thi.ng/rstream-log@0.5.12 - @thi.ng/rstream@0.9.0 - @thi.ng/transducers@1.0.6 - @thi.ng/unionstruct@0.1.5 --- packages/api/CHANGELOG.md | 21 +++++++++++++++++++++ packages/api/package.json | 6 +++--- packages/atom/CHANGELOG.md | 8 ++++++++ packages/atom/package.json | 6 +++--- packages/bitstream/CHANGELOG.md | 8 ++++++++ packages/bitstream/package.json | 4 ++-- packages/checks/CHANGELOG.md | 8 ++++++++ packages/checks/package.json | 4 ++-- packages/csp/CHANGELOG.md | 8 ++++++++ packages/csp/package.json | 8 ++++---- packages/dcons/CHANGELOG.md | 8 ++++++++ packages/dcons/package.json | 6 +++--- packages/diff/CHANGELOG.md | 12 ++++++++++++ packages/diff/package.json | 6 +++--- packages/hiccup-dom/CHANGELOG.md | 13 +++++++++++++ packages/hiccup-dom/package.json | 10 +++++----- packages/hiccup/CHANGELOG.md | 8 ++++++++ packages/hiccup/package.json | 6 +++--- packages/iterators/CHANGELOG.md | 8 ++++++++ packages/iterators/package.json | 6 +++--- packages/rle-pack/CHANGELOG.md | 8 ++++++++ packages/rle-pack/package.json | 6 +++--- packages/rstream-csp/CHANGELOG.md | 8 ++++++++ packages/rstream-csp/package.json | 8 ++++---- packages/rstream-log/CHANGELOG.md | 8 ++++++++ packages/rstream-log/package.json | 6 +++--- packages/rstream/CHANGELOG.md | 11 +++++++++++ packages/rstream/package.json | 8 ++++---- packages/transducers/CHANGELOG.md | 11 +++++++++++ packages/transducers/package.json | 6 +++--- packages/unionstruct/CHANGELOG.md | 8 ++++++++ packages/unionstruct/package.json | 4 ++-- 32 files changed, 206 insertions(+), 50 deletions(-) create mode 100644 packages/diff/CHANGELOG.md create mode 100644 packages/hiccup-dom/CHANGELOG.md diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index c430433187..31b9d972bb 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -3,6 +3,27 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/api@1.5.0...@thi.ng/api@2.0.0) (2018-02-01) + + +### Bug Fixes + +* **api:** fix equiv string handling, update tests ([1354e29](https://github.com/thi-ng/umbrella/commit/1354e29)) + + +### Features + +* **api:** update equiv() null handling, add tests ([878520e](https://github.com/thi-ng/umbrella/commit/878520e)) + + +### BREAKING CHANGES + +* **api:** equiv now treats null & undefined as equal + + + + # [1.5.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/api@1.4.2...@thi.ng/api@1.5.0) (2018-01-31) diff --git a/packages/api/package.json b/packages/api/package.json index 4138894892..7df0d3c55b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/api", - "version": "1.5.0", + "version": "2.0.0", "description": "Common, generic types & interfaces for thi.ng projects", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/checks": "^1.1.4" + "@thi.ng/checks": "^1.1.5" }, "keywords": [ "compare", @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/atom/CHANGELOG.md b/packages/atom/CHANGELOG.md index 191934b01c..ac4e31a3d8 100644 --- a/packages/atom/CHANGELOG.md +++ b/packages/atom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.4.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@0.4.0...@thi.ng/atom@0.4.1) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/atom + # [0.4.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@0.3.0...@thi.ng/atom@0.4.0) (2018-01-31) diff --git a/packages/atom/package.json b/packages/atom/package.json index 6647a08a1e..4425840e40 100644 --- a/packages/atom/package.json +++ b/packages/atom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/atom", - "version": "0.4.0", + "version": "0.4.1", "description": "Mutable wrapper for a immutable values", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0" + "@thi.ng/api": "^2.0.0" }, "keywords": [ "cursor", @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/bitstream/CHANGELOG.md b/packages/bitstream/CHANGELOG.md index 08aa8358c5..5102c7c39a 100644 --- a/packages/bitstream/CHANGELOG.md +++ b/packages/bitstream/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/bitstream@0.3.4...@thi.ng/bitstream@0.3.5) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/bitstream + ## [0.3.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/bitstream@0.3.3...@thi.ng/bitstream@0.3.4) (2018-01-30) diff --git a/packages/bitstream/package.json b/packages/bitstream/package.json index ba89ce6e88..2bd175d2d0 100644 --- a/packages/bitstream/package.json +++ b/packages/bitstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/bitstream", - "version": "0.3.4", + "version": "0.3.5", "description": "ES6 iterator based read/write bit streams & support for variable word widths", "main": "./index.js", "typings": "./index.d.ts", @@ -37,4 +37,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/checks/CHANGELOG.md b/packages/checks/CHANGELOG.md index 9a18399e25..8fe7bcaad5 100644 --- a/packages/checks/CHANGELOG.md +++ b/packages/checks/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@1.1.4...@thi.ng/checks@1.1.5) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/checks + ## [1.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@1.1.3...@thi.ng/checks@1.1.4) (2018-01-30) diff --git a/packages/checks/package.json b/packages/checks/package.json index 280ab73c77..8312713629 100644 --- a/packages/checks/package.json +++ b/packages/checks/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/checks", - "version": "1.1.4", + "version": "1.1.5", "description": "Single-function sub-modules for type, feature & value checks", "main": "./index.js", "typings": "./index.d.ts", @@ -38,4 +38,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index 3e3b0d4a26..9217a8a092 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.3.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.8...@thi.ng/csp@0.3.9) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/csp + ## [0.3.8](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@0.3.7...@thi.ng/csp@0.3.8) (2018-01-31) diff --git a/packages/csp/package.json b/packages/csp/package.json index be25bf011f..075e768354 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "0.3.8", + "version": "0.3.9", "description": "ES6 promise based CSP implementation", "main": "./index.js", "typings": "./index.d.ts", @@ -30,8 +30,8 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/dcons": "^0.1.9", - "@thi.ng/transducers": "^1.0.5" + "@thi.ng/dcons": "^0.1.10", + "@thi.ng/transducers": "^1.0.6" }, "keywords": [ "async", @@ -49,4 +49,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index ecf09feb07..53fb9bb319 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@0.1.9...@thi.ng/dcons@0.1.10) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/dcons + ## [0.1.9](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@0.1.8...@thi.ng/dcons@0.1.9) (2018-01-31) diff --git a/packages/dcons/package.json b/packages/dcons/package.json index 1668cd54ac..bd3319f644 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "0.1.9", + "version": "0.1.10", "description": "Comprehensive doubly linked list structure w/ iterator support", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0" + "@thi.ng/api": "^2.0.0" }, "keywords": [ "datastructure", @@ -41,4 +41,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/diff/CHANGELOG.md b/packages/diff/CHANGELOG.md new file mode 100644 index 0000000000..7bf689ec13 --- /dev/null +++ b/packages/diff/CHANGELOG.md @@ -0,0 +1,12 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + +# 0.1.0 (2018-02-01) + + +### Features + +* **diff:** re-import diff package (MBP2010) ([4d0d437](https://github.com/thi-ng/umbrella/commit/4d0d437)) diff --git a/packages/diff/package.json b/packages/diff/package.json index f3be677f8a..edb8816380 100644 --- a/packages/diff/package.json +++ b/packages/diff/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/diff", - "version": "0.0.1", + "version": "0.1.0", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -24,7 +24,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0" + "@thi.ng/api": "^2.0.0" }, "keywords": [ "array", @@ -37,4 +37,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/hiccup-dom/CHANGELOG.md b/packages/hiccup-dom/CHANGELOG.md new file mode 100644 index 0000000000..cf2dcc3152 --- /dev/null +++ b/packages/hiccup-dom/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + + +# 0.1.0 (2018-02-01) + + +### Features + +* **hiccup-dom:** add start(), update readme ([3101698](https://github.com/thi-ng/umbrella/commit/3101698)) +* **hiccup-dom:** re-import package (MBP2010) ([30ffd00](https://github.com/thi-ng/umbrella/commit/30ffd00)) diff --git a/packages/hiccup-dom/package.json b/packages/hiccup-dom/package.json index e792335008..de73be43e2 100644 --- a/packages/hiccup-dom/package.json +++ b/packages/hiccup-dom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-dom", - "version": "0.0.1", + "version": "0.1.0", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -24,9 +24,9 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/diff": "^0.0.1", - "@thi.ng/hiccup": "0.1.5", - "@thi.ng/iterators": "^4.0.2" + "@thi.ng/diff": "^0.1.0", + "@thi.ng/hiccup": "^0.1.6", + "@thi.ng/iterators": "^4.0.3" }, "keywords": [ "browser", @@ -41,4 +41,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/hiccup/CHANGELOG.md b/packages/hiccup/CHANGELOG.md index b2f30b748d..0ce14c8fad 100644 --- a/packages/hiccup/CHANGELOG.md +++ b/packages/hiccup/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@0.1.5...@thi.ng/hiccup@0.1.6) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/hiccup + ## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@0.1.4...@thi.ng/hiccup@0.1.5) (2018-01-30) diff --git a/packages/hiccup/package.json b/packages/hiccup/package.json index 0a2a97819a..3a245149ec 100644 --- a/packages/hiccup/package.json +++ b/packages/hiccup/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup", - "version": "0.1.5", + "version": "0.1.6", "description": "HTML/SVG/XML serialization of nested data structures, iterables & closures", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/checks": "^1.1.4" + "@thi.ng/checks": "^1.1.5" }, "keywords": [ "clojure", @@ -45,4 +45,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index c919b88a24..82ef3a8f58 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [4.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.0.2...@thi.ng/iterators@4.0.3) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/iterators + ## [4.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@4.0.1...@thi.ng/iterators@4.0.2) (2018-01-31) diff --git a/packages/iterators/package.json b/packages/iterators/package.json index cb4acf4949..74efa9dad5 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "4.0.2", + "version": "4.0.3", "description": "clojure.core inspired, composable ES6 iterators & generators", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/dcons": "^0.1.9" + "@thi.ng/dcons": "^0.1.10" }, "keywords": [ "clojure", @@ -42,4 +42,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/rle-pack/CHANGELOG.md b/packages/rle-pack/CHANGELOG.md index ed8abee20d..9027fcb027 100644 --- a/packages/rle-pack/CHANGELOG.md +++ b/packages/rle-pack/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/rle-pack@0.2.5...@thi.ng/rle-pack@0.2.6) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/rle-pack + ## [0.2.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rle-pack@0.2.4...@thi.ng/rle-pack@0.2.5) (2018-01-30) diff --git a/packages/rle-pack/package.json b/packages/rle-pack/package.json index c5239ec677..7ddbbb6d7b 100644 --- a/packages/rle-pack/package.json +++ b/packages/rle-pack/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rle-pack", - "version": "0.2.5", + "version": "0.2.6", "description": "Binary run-length encoding packer w/ flexible repeat bit widths", "main": "./index.js", "typings": "./index.d.ts", @@ -27,7 +27,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/bitstream": "^0.3.4" + "@thi.ng/bitstream": "^0.3.5" }, "keywords": [ "binary", @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 2b607465e3..567540186c 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.10...@thi.ng/rstream-csp@0.1.11) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/rstream-csp + ## [0.1.10](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@0.1.9...@thi.ng/rstream-csp@0.1.10) (2018-01-31) diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 3c451f670b..aa22ae8893 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "0.1.10", + "version": "0.1.11", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -26,8 +26,8 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/csp": "^0.3.8", - "@thi.ng/rstream": "^0.8.1" + "@thi.ng/csp": "^0.3.9", + "@thi.ng/rstream": "^0.9.0" }, "keywords": [ "bridge", @@ -40,4 +40,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index ea9490d727..85b5cf7f66 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.5.12](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@0.5.11...@thi.ng/rstream-log@0.5.12) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/rstream-log + ## [0.5.11](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@0.5.10...@thi.ng/rstream-log@0.5.11) (2018-01-31) diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index a0c8f3a39e..aedfb17fdb 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "0.5.11", + "version": "0.5.12", "description": "TODO", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/rstream": "^0.8.1" + "@thi.ng/rstream": "^0.9.0" }, "keywords": [ "ES6", @@ -41,4 +41,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 0bdc523fc9..2e21618032 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [0.9.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@0.8.1...@thi.ng/rstream@0.9.0) (2018-02-01) + + +### Features + +* **rstream:** add Cache subscription class ([ea638be](https://github.com/thi-ng/umbrella/commit/ea638be)) + + + + ## [0.8.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@0.8.0...@thi.ng/rstream@0.8.1) (2018-01-31) diff --git a/packages/rstream/package.json b/packages/rstream/package.json index cbba4e0586..d8cd3dfa66 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "0.8.1", + "version": "0.9.0", "description": "Reactive multi-tap streams & transformation pipeline constructs", "main": "./index.js", "typings": "./index.d.ts", @@ -26,8 +26,8 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/atom": "^0.4.0", - "@thi.ng/transducers": "^1.0.5" + "@thi.ng/atom": "^0.4.1", + "@thi.ng/transducers": "^1.0.6" }, "keywords": [ "datastructure", @@ -44,4 +44,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index 59f4cc3125..d673a9187d 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.0.6](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@1.0.5...@thi.ng/transducers@1.0.6) (2018-02-01) + + +### Bug Fixes + +* **transducers:** update comp() for typescript 2.7.* ([febe39f](https://github.com/thi-ng/umbrella/commit/febe39f)) + + + + ## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@1.0.4...@thi.ng/transducers@1.0.5) (2018-01-31) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index e5ccbfaa46..17a957bc63 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "1.0.5", + "version": "1.0.6", "description": "Lightweight transducer implementations for ES6 / TypeScript", "main": "./index.js", "typings": "./index.d.ts", @@ -26,7 +26,7 @@ "webpack": "^3.10.0" }, "dependencies": { - "@thi.ng/api": "^1.5.0" + "@thi.ng/api": "^2.0.0" }, "keywords": [ "ES6", @@ -42,4 +42,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +} diff --git a/packages/unionstruct/CHANGELOG.md b/packages/unionstruct/CHANGELOG.md index 9b3f6007f7..e9b3ccd798 100644 --- a/packages/unionstruct/CHANGELOG.md +++ b/packages/unionstruct/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/unionstruct@0.1.4...@thi.ng/unionstruct@0.1.5) (2018-02-01) + + + + +**Note:** Version bump only for package @thi.ng/unionstruct + ## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/unionstruct@0.1.3...@thi.ng/unionstruct@0.1.4) (2018-01-30) diff --git a/packages/unionstruct/package.json b/packages/unionstruct/package.json index 5557096719..c1a73ad403 100644 --- a/packages/unionstruct/package.json +++ b/packages/unionstruct/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/unionstruct", - "version": "0.1.4", + "version": "0.1.5", "description": "C-style struct, union and bitfield views of ArrayBuffers", "main": "./index.js", "typings": "./index.d.ts", @@ -39,4 +39,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +}