From 5a6dcc162b8486c456afd9cac689ce187e06e6e7 Mon Sep 17 00:00:00 2001 From: Marcel Kloubert Date: Sat, 30 Dec 2017 10:26:31 +0100 Subject: [PATCH] shell commands, S3 and external sources --- CHANGELOG.md | 6 +- README.md | 3 + copyright.txt | 1 + img/share/Email.png | Bin 0 -> 3676 bytes img/share/Facebook.png | Bin 0 -> 3394 bytes img/share/Google+.png | Bin 0 -> 3869 bytes img/share/LinkedIn.png | Bin 0 -> 3452 bytes img/share/Pinboard.png | Bin 0 -> 3562 bytes img/share/Pinterest.png | Bin 0 -> 3847 bytes img/share/Pocket.png | Bin 0 -> 3579 bytes img/share/Reddit.png | Bin 0 -> 3971 bytes img/share/Tumblr.png | Bin 0 -> 3439 bytes img/share/Twitter.png | Bin 0 -> 3644 bytes img/share/Wordpress.png | Bin 0 -> 3972 bytes src/clients/dropbox.ts | 4 +- src/download.ts | 236 +++++++++++++++++++++++++++++++++++++++- 16 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 img/share/Email.png create mode 100644 img/share/Facebook.png create mode 100644 img/share/Google+.png create mode 100644 img/share/LinkedIn.png create mode 100644 img/share/Pinboard.png create mode 100644 img/share/Pinterest.png create mode 100644 img/share/Pocket.png create mode 100644 img/share/Reddit.png create mode 100644 img/share/Tumblr.png create mode 100644 img/share/Twitter.png create mode 100644 img/share/Wordpress.png diff --git a/CHANGELOG.md b/CHANGELOG.md index ae23d77..2a619d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,14 @@ # Change Log (vscode-deploy-reloaded) -## 0.10.0 (December 30th, 2017; shell commands and S3) +[![Share via Facebook](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Facebook.png)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded) [![Share via Twitter](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Twitter.png)](https://twitter.com/intent/tweet?source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&text=vscode-deploy-reloaded:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&via=mjkloubert) [![Share via Google+](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Google+.png)](https://plus.google.com/share?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Pinterest](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Pinterest.png)](https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&media=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif&description=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.) [![Share via Reddit](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Reddit.png)](https://www.reddit.com/submit?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded) [![Share via LinkedIn](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/LinkedIn.png)](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded&summary=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Wordpress](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Wordpress.png)](https://wordpress.com/press-this.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded&s=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&i=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif) [![Share via Email](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Email.png)](mailto:?subject=vscode-deploy-reloaded&body=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20'vs-deploy'%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) + + +## 0.10.0 (December 30th, 2017; shell commands, S3 and external sources) * added `executeOnStartup` [setting](https://github.com/mkloubert/vscode-deploy-reloaded/wiki#settings--), which runs [shell commands on startup](https://github.com/mkloubert/vscode-deploy-reloaded/wiki/execute_on_startup) * fixed use of [if](https://github.com/mkloubert/vscode-deploy-reloaded/wiki/if) property in setting objects * better handling of [credentials config](https://github.com/mkloubert/vscode-deploy-reloaded/wiki/target_s3bucket#credentials) of [S3 target](https://github.com/mkloubert/vscode-deploy-reloaded/wiki/target_s3bucket) +* added `dropbox`, `ftp`, `sftp` and `slack` protocol support for [external sources](https://github.com/mkloubert/vscode-deploy-reloaded/wiki/external_sources) ## 0.9.0 (December 30th, 2017; [Composer](https://getcomposer.org/)) diff --git a/README.md b/README.md index b0d68d1..bb14928 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # vscode-deploy-reloaded +[![Share via Facebook](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Facebook.png)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded) [![Share via Twitter](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Twitter.png)](https://twitter.com/intent/tweet?source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&text=vscode-deploy-reloaded:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&via=mjkloubert) [![Share via Google+](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Google+.png)](https://plus.google.com/share?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Pinterest](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Pinterest.png)](https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&media=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif&description=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.) [![Share via Reddit](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Reddit.png)](https://www.reddit.com/submit?url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded) [![Share via LinkedIn](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/LinkedIn.png)](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded&title=vscode-deploy-reloaded&summary=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&source=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) [![Share via Wordpress](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Wordpress.png)](https://wordpress.com/press-this.php?u=https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded"e=vscode-deploy-reloaded&s=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20%27vs-deploy%27%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.&i=https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/demo1.gif) [![Share via Email](https://raw.githubusercontent.com/mkloubert/vscode-deploy-reloaded/master/img/share/Email.png)](mailto:?subject=vscode-deploy-reloaded&body=Recoded%20version%20of%20Visual%20Studio%20Code%20extension%20'vs-deploy'%2C%20which%20provides%20commands%20to%20deploy%20files%20to%20one%20or%20more%20destinations.:%20https%3A%2F%2Fmarketplace.visualstudio.com%2Fitems%3FitemName%3Dmkloubert.vscode-deploy-reloaded) + + [![Latest Release](https://vsmarketplacebadge.apphb.com/version-short/mkloubert.vscode-deploy-reloaded.svg)](https://marketplace.visualstudio.com/items?itemName=mkloubert.vscode-deploy-reloaded) [![Installs](https://vsmarketplacebadge.apphb.com/installs/mkloubert.vscode-deploy-reloaded.svg)](https://marketplace.visualstudio.com/items?itemName=mkloubert.vscode-deploy-reloaded) [![Rating](https://vsmarketplacebadge.apphb.com/rating-short/mkloubert.vscode-deploy-reloaded.svg)](https://marketplace.visualstudio.com/items?itemName=mkloubert.vscode-deploy-reloaded#review-details) diff --git a/copyright.txt b/copyright.txt index a9097c2..37772f8 100644 --- a/copyright.txt +++ b/copyright.txt @@ -1,3 +1,4 @@ Icons: - /icon.png (DinosoftLabs; https://www.iconfinder.com/dinosoftlabs) + - /img/share/* (https://simplesharingbuttons.com) diff --git a/img/share/Email.png b/img/share/Email.png new file mode 100644 index 0000000000000000000000000000000000000000..8e914533526a5e5e087a8696ee91fb1fcea78c15 GIT binary patch literal 3676 zcmV-i4x{mjP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000ArNklC*>N`lE=VqnaLfhDCKbawusj7?um$J)_9W*B?U_U7rVr>Ag$7O$5*PtSFo z=f0oozMeL0VtiuK4GaSVKma%lxWwZ!unwewo51y$7R}jtZ<`I`05Af43aB>q{sVjq zjK;KRdQSqzCnh_9G2nAMLL1;Ya1FQ;)1oEY0>&pM{lInLD9u3@7>;St%#H%aCnkfy zcfe~j7e(M=OpC@F3J_nu&;s&W5uw_hXfxG3)x>Szt{gqpo{(xDj2!?uf@ADIJ0OnQ z@;xr&aTh0GHZ?!#y&aj6+qC6@^GR zh`Xz6Pvp6Lp1JurdZj`|*D(ykY*t=L*lV4`4Go^hp{mTx-s1lHgI$x~Uw^>N>@6Is z%Fy6>6j?SeQGsDeczYc>TrP$#4B+#6SWF~YN-dkez!HXGu#{S6F_FaQ^)Pf{fDV_d z(eeRB3>Hf$ib5pZN9Nwo+|Ar$bF)ByC`fzzE0*iGw*Kb!LYybL9D$R5{3nj@q&Fam zskSZrCysNjKSZHWU~2jXxqRNT-c!>zC=?2u>kru>2RJO%jMQ!6^LiTgg}L57ug7ky zxRl*AmLe-Cs)At{EGClVpKb!Mnq7NYGDY6iE0IK)*b$F6Hkg{8pP=*x6ex?+()@wW@>td#~T}V`OAt(GVgD<>X%=$+*wI;sI!wuIEd5fq7d5J%T_DwT?*6<4R> z*T827IE(oNL0Tv=MKo4+LbnJe* u{VNf}Gylis^vjqQy}Pg5ajUQAF9ra=dQZG~$=`+m0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0007QNkl&ngu#W& zSo0SY+O^p1O;-j2D&neL1Sti-B1IRW1&Li5KWnQ^O2M1e5iQq-FV62Md{Zl>!J z5HMmMU>Y!0gdTt*5CiU};^t3f0RbcC1CqcHjX?$orQ+stO#uNTb{2RJbkSJ+0D`Hw zxp<%e`STY|Ah(Jbw?@LTZ_i)Z3HzAOi*e-)Bd7c6?9c&N$$sI+y+^gSW3+T8bj!fB z9rCLehl$)gU-90lX|+Bb60X|-nkCgtRdUa<4(=G|s^{PKUzH_H;oOZt)K036`MkR! z2UvQS<>|r)^4kS|ZEmU7pD1u$mkJlQbCP# zO$h_u9{T&-74N+#yX>T)6@!|kr8We=x3=v}ck6a$FD$Ll?dfE|+r#jw6MJcx&XW7S z0l>$#Z?**MVkVTLaDQ&6k6gPnQYPTx<2Ss1zgADc)-`c5?ZT=iHmY4nYvSSBg?UY! zPreQ0c_68Ydrh=KKq3`4bET>=B?hupC<^C}9}w$2+d=`eCA)5|o0DRfnvINb9S&1k z);VM#C=;7O9^8L7sAyf{+s7Nc9U1xa#r*?Sd#9)z1s?oob`)ie(Q3D%!+kkz)%E<} Y0O%gZ3aRQqd;kCd07*qoM6N<$g3L}%rvLx| literal 0 HcmV?d00001 diff --git a/img/share/Google+.png b/img/share/Google+.png new file mode 100644 index 0000000000000000000000000000000000000000..270a2de6c78d2da8273003925d44c466b4c02133 GIT binary patch literal 3869 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 literal 0 HcmV?d00001 diff --git a/img/share/LinkedIn.png b/img/share/LinkedIn.png new file mode 100644 index 0000000000000000000000000000000000000000..96c801d7a1336566330dda3b7148167267f52250 GIT binary patch literal 3452 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 literal 0 HcmV?d00001 diff --git a/img/share/Pinterest.png b/img/share/Pinterest.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5eff492c4bca7a3463cd7a3dfdbace68cbd59b GIT binary patch literal 3847 zcmV+i5BTtjP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000CsNkl6vuz_W+=??S_llWgjxqJOj|yrR7b^1iyMr!N>dj#ek5v$ zxTp&jZFFHUA(H6AjSAJ+7=yvqplFN<5=xD!lxd2Tigt==r$~U|yD)srw~M(9Gsv6w z1ZwoG-sGNp&wtMSpL70Kheoqotm!}nPzDqN*?=sT-M|f?7w7<5Y);37mUDF)0v7_W z14n=ajd*=PGf-!9I(pXxz;3Z_2HpW)(E?P#LcmGjxXtO9)eOLHvE~6Szz#OX{s1a$ zPDh_A0K3KdAkYeIVPkCuD7QHs7Zd@AfBy4r2p$chBsvqi6?fjPmiFX=e9|ipv1MNg ziQBS}OeO+uHw#y){y?x6Y=RkF~Rj? z)y#Bu#dB-0IUTP?0EklSQ6i;eOk(HhMv@EiArxZ#t8WTj{U;sbUdRM9qtoAznYgZHwVkxZ-Gw7Kus-^-+qT7HHEE} zFJsEv#r&^*5DbRXKQ@Mxl*r}>?nf`ncn1fW@B2*&fVDE!{GlY;t73;sJ9H3qI()8C z#+uFmkaOxIvZ`NW`;!hyGCg@2E@mZ|LbGrOYPjJY|>dxuBV0Ax#1BXw1~)qW0u)JG3s+G)k( zycr?g?8Qq2=H_DjQ%d(mzTKC))d0wnn#WXY8}45&qca$g?<*#`umGg+Hn%;t&J!}s zq&;~slK!c-v#PyW5@JGmo(2M3d;TScKRC(s*>lLYy~_kGEC8KO+`W-|-hU4%F%baQ zsm}<^%&5h8>+BY5FHoR$n&f`^F)8~WSw5k=hlT!rQudd!Y3m&T%=KL6>d_YndOT{! zT`>q5r44{2A@AK2=EhIwNysoG7Z)KH7m0L*+w?$9t(M>by#}G-p4H-QvgV?f!OPHt+#0 zl2EVBT6QF5TL4(R;ly)uV7=m`+2(XiER|uM7?E*JpPCB5Xk*iQgNH;+Bmg0u8&r3B zJb3;b+z0>-OL9HB5uFfnNzpt*LtL*uPRQ$BuR=cYpAn@otynCS3&-0LynN-`;BT`) z==Kt|>sUkDOIE%KRs|51iDJKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009fNkl1wSY*N%Hx`ODzgP)N z?|WyyzjqXTBGKHs8fXFb0Cm6yAS{CdVp@-G~#~jDn1<70TJLZ5cJ763%me2 zb<>E=i$J2ebve)lobp4|1p;^kT-Hq^?VCWNxwRJP1~#%V7z0{#)37`VB$``y0k44- zEG$yMe%&1q8pH<_PK0Q z1_A`uuLDh+n;XYr`pZ|Co_4E_?Ye2i@>U~m6|wxzHMAYI^E#?CFhu%7)UEm=z%fO3 zxUX(aW>wGgzq;?_f#ZnDUvAB6ohsXFuxb$x1l(4FK#MAS`@g~-RSp(kn0)YrsTO%Y7o#f~J$8#Z2r^>133%TzpL^4Gta+_@b;EeN67MY7T5y|g}RC+E1HmC(7 z)e}qG+Xyz)A#9sW$1SqG{bYOl$wY1=Y#VLIR+e5mU0iQJCo7o@tDdKhPt4R#O^9%3 z2f@Y$a2zr>?vlB27h&538yg7U>OiRp74OaED%w}2m~gLUYoz#t79bpLC$zT-90weS z(C(dtqwOf6VCB8Dkgbsh#^4=STD&2;uc> zk1CZ<)+-Uy=dR-nje7V0p;6N3t`{Y51>M-4pN3C?qn_4PmC)WMY7Xv0+p=jU?n2;v zwyLPhidII~DI;Gu3B zXG;~)6)BghjWOwqA_7vQwMgMuEu^G8PtPJCNm#)CDv`*`a;vlzQ$nH-Xk6fMj7d4( zS8f(ihJ*#w0}o}!&KE-3s4w>_`oABii}gJJJpePNH8*`I8wmga002ovPDHLkV1m{Q BtJMGi literal 0 HcmV?d00001 diff --git a/img/share/Reddit.png b/img/share/Reddit.png new file mode 100644 index 0000000000000000000000000000000000000000..a36fad0fb0866548135ed78791b8020d8076c6c7 GIT binary patch literal 3971 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 literal 0 HcmV?d00001 diff --git a/img/share/Tumblr.png b/img/share/Tumblr.png new file mode 100644 index 0000000000000000000000000000000000000000..435338b8f3f4d2c971a4fccfd95b06e257bd2a87 GIT binary patch literal 3439 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 R_b31W002ovPDHLkV1fk7YW@HK literal 0 HcmV?d00001 diff --git a/img/share/Twitter.png b/img/share/Twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..382470728211a7c72c6f617dc27a25732beaf085 GIT binary patch literal 3644 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 e{jaX)e+>ZFlNME+;IL)@0000opts; } diff --git a/src/download.ts b/src/download.ts index b2023d1..983c158 100644 --- a/src/download.ts +++ b/src/download.ts @@ -15,6 +15,10 @@ * along with this program. If not, see . */ +import * as deploy_clients_dropbox from './clients/dropbox'; +import * as deploy_clients_ftp from './clients/ftp'; +import * as deploy_clients_sftp from './clients/sftp'; +import * as deploy_clients_slack from './clients/slack'; import * as deploy_helpers from './helpers'; import * as deploy_http from './http'; import * as HTTP from 'http'; @@ -23,8 +27,81 @@ import * as Path from 'path'; import * as URL from 'url'; -type Downloader = (url: URL.Url) => Buffer | PromiseLike +type DownloadClientConfigMappings = { [ configProperty: string ]: DownloadClientConfigTargetType }; +type DownloadClientConfigTargetType = undefined | null | + 'bool' | + 'int' | + 'string_array'; + +type Downloader = (url: URL.Url) => Buffer | PromiseLike; + + +function createDownloadConfig(url: URL.Url, mappings: DownloadClientConfigMappings): any { + if (!mappings) { + mappings = {}; + } + + const CONFIG: any = {}; + + const PARAMS = deploy_helpers.uriParamsToObject(url); + for (const P in PARAMS) { + for (let prop in mappings) { + if (P !== deploy_helpers.normalizeString(prop)) { + continue; + } + + let val: any = PARAMS[P]; + + const TARGET_TYPE = mappings[prop]; + if (!deploy_helpers.isNullOrUndefined(TARGET_TYPE)) { + switch (TARGET_TYPE) { + case 'bool': + if (deploy_helpers.isEmptyString(val)) { + val = undefined; + } + else { + switch ( deploy_helpers.normalizeString(val) ) { + case '1': + case 'true': + case 'y': + case 'yes': + val = true; + break; + + default: + val = false; + break; + } + } + break; + + case 'int': + if (deploy_helpers.isEmptyString(val)) { + val = undefined; + } + else { + val = parseInt( val.trim() ); + } + break; + + case 'string_array': + if (deploy_helpers.isEmptyString(val)) { + val = undefined; + } + else { + val = val.split(','); + } + break; + } + } + + CONFIG[prop] = val; + } + } + + return CONFIG; +} /** * Downloads something from a source. @@ -65,11 +142,27 @@ export async function download(url: string | URL.Url, scopes?: string | string[] const PROTOCOL = deploy_helpers.normalizeString(url.protocol); switch (PROTOCOL) { + case 'dropbox:': + downloader = download_dropbox; + break; + + case 'ftp:': + downloader = download_ftp; + break; + case 'http:': case 'https:': downloader = download_http; break; + case 'sftp:': + downloader = download_sftp; + break; + + case 'slack:': + downloader = download_slack; + break; + default: // handle as local file downloader = async () => { @@ -107,6 +200,46 @@ export async function download(url: string | URL.Url, scopes?: string | string[] } +async function download_dropbox(url: URL.Url): Promise { + const CFG: deploy_clients_dropbox.DropboxOptions = createDownloadConfig(url, { + accessToken: null, + }); + + const CLIENT = deploy_clients_dropbox.createClient(CFG); + try { + return await CLIENT.downloadFile( + url.pathname, + ); + } + finally { + deploy_helpers.tryDispose(CLIENT); + } +} + +async function download_ftp(url: URL.Url): Promise { + const AUTH = getUserNameAndPassword(url); + const SERVER = getHostAndPort(url); + + const CFG: deploy_clients_ftp.FTPConnectionOptions = createDownloadConfig(url, { + engine: null, + }); + + (CFG).host = SERVER.host; + (CFG).port = SERVER.port; + (CFG).password = AUTH.password; + (CFG).user = AUTH.user; + + const CLIENT = await deploy_clients_ftp.openConnection(CFG); + try { + return await CLIENT.downloadFile( + url.pathname, + ); + } + finally { + deploy_helpers.tryDispose(CLIENT); + } +} + async function download_http(url: URL.Url): Promise { const RESPONSE = await deploy_http.request(url); @@ -125,3 +258,104 @@ async function download_http(url: URL.Url): Promise { throw new Error(i18.t(errorKey, RESPONSE.statusCode, RESPONSE.statusMessage)); } + +async function download_sftp(url: URL.Url): Promise { + const AUTH = getUserNameAndPassword(url); + const SERVER = getHostAndPort(url); + + const CFG: deploy_clients_sftp.SFTPConnectionOptions = createDownloadConfig(url, { + agent: null, + agentForward: 'bool', + debug: 'bool', + hashAlgorithm: null, + hashes: 'string_array', + privateKey: null, + privateKeyPassphrase: null, + readyTimeout: 'int', + tryKeyboard: 'bool', + }); + + (CFG).host = SERVER.host; + (CFG).port = SERVER.port; + (CFG).password = AUTH.password; + (CFG).user = AUTH.user; + + const CLIENT = await deploy_clients_sftp.openConnection(CFG); + try { + return await CLIENT.downloadFile( + url.pathname, + ); + } + finally { + deploy_helpers.tryDispose(CLIENT); + } +} + +async function download_slack(url: URL.Url): Promise { + const CHANNEL = deploy_helpers.toStringSafe(url.hostname).toUpperCase().trim(); + + const CFG: deploy_clients_slack.SlackOptions = createDownloadConfig(url, { + token: null, + }); + + const CLIENT = deploy_clients_slack.createClient(CFG); + try { + return await CLIENT.downloadFile( + CHANNEL + url.pathname, + ); + } + finally { + deploy_helpers.tryDispose(CLIENT); + } +} + +function getHostAndPort(url: URL.Url) { + let host = deploy_helpers.toStringSafe(url.hostname); + let port = parseInt( + deploy_helpers.toStringSafe(url.port).trim() + ); + + if (deploy_helpers.isEmptyString(host)) { + host = undefined; + } + + if (isNaN(port)) { + port = undefined; + } + + return { + host: host, + port: port, + }; +} + +function getUserNameAndPassword(url: URL.Url) { + let user: string; + let password: string; + + const AUTH = deploy_helpers.toStringSafe(url.auth); + if (!deploy_helpers.isEmptyString(AUTH)) { + const SEP = AUTH.indexOf(':'); + if (SEP > -1) { + user = AUTH.substr(0, SEP); + password = AUTH.substr(SEP + 1); + } + else { + user = AUTH; + } + } + + if (deploy_helpers.isEmptyString(user)) { + user = undefined; + } + + password = deploy_helpers.toStringSafe(password); + if ('' === password) { + password = undefined; + } + + return { + password: password, + user: user, + }; +}